Python WebAcademy

Python WebAcademy Blog

PyMongo 4.20がリリース。AIのコーディングエージェントから接続したことをMongoDBに伝えるようになったニュースを初心者向けに解説

|

2026年11月12日、PythonからMongoDBを使うための公式ドライバーPyMongoの4.20.0が公開されました。AIのコーディングエージェントの中で動いていることを環境変数から見つけ、接続のときにデータベースへ伝えるようになっています。接続の数の設定まわりの不具合なども直りました。4.19.0と4.20.0で動かした結果とともに整理します。

2026年11月12日、PythonからデータベースのMongoDBを使うための公式ドライバーPyMongoの4.20.0が公開されました。10月14日の4.19.0から、およそ1か月ぶりの新しい版です。

今回、時代を感じさせるのが、AIのコーディングエージェントの検出です。AIがコードを書いて動かしている環境から接続したときに、そのことをMongoDBのサーバーに伝えるようになりました。

ほかにも、接続の数の設定や、データの変換まわりの不具合が直されています。今回は、4.19.0と4.20.0で同じコードを動かしながら、何が変わったのかを見ていきます。

まずはMongoDBとPyMongoとは

最初に、MongoDBとPyMongoを知らない方のために、簡単に紹介します。MongoDBは、データを表ではなく、JSONに似た形の文書として保存するデータベースです。

このように、表の形にしばられないデータベースは、NoSQLと呼ばれます。PyMongoは、PythonからMongoDBに接続して、データを読み書きするための、MongoDB社の公式のライブラリです。

表のデータベースとの違い

SQLiteのような表のデータベースと、大まかに比べてみましょう。

項目 SQLiteなどの表のデータベース MongoDB
データの形 行と列の決まった表 JSONに似た形の文書
項目の追加 表の形を変える必要がある 文書ごとに自由に項目を持てる
問い合わせ SQLで書く 辞書のような条件で書く

どちらが優れているというより、扱うデータの形に合わせて選ぶのが基本です。

PythonのSQLiteの使い方は、こちらで紹介しています。【関連記事】Pythonからデータベースを操作するsqlite3の使い方

MongoDBの文書はJSONとよく似ているので、JSONの扱いに慣れておくと理解が早くなります。【関連記事】PythonでJSONデータの扱いをマスター

文書はBSONという形で送られる

PyMongoでは、Pythonの辞書がそのままMongoDBの文書になります。実際には、BSONというJSONに似た形に変換されてから、サーバーに送られます。

PyMongoに含まれるbsonモジュールを使うと、サーバーがなくても、この変換を試せます。

import bson
from bson.objectid import ObjectId

doc = {"_id": ObjectId("64b7f0c2a1d3e4f5a6b7c8d9"), "name": "taro", "tags": ["新着", "セール"]}
data = bson.encode(doc)
print(type(data).__name__, len(data), "バイト")
print(bson.decode(data))

4.20.0で実行すると、辞書が79バイトのbytesに変換され、元に戻すと同じ辞書が返ってきました。Pythonの辞書を書く感覚でデータベースを扱えるのが、MongoDBとPyMongoの手軽なところです。

4.20で何が変わったのかを整理しよう

続いて、4.20.0の主な変更を表にまとめます。内容は、PyMongoの公式リポジトリにある変更履歴doc/changelog.rstにもとづいています。

分類 主な変更
新機能 AIのコーディングエージェントを検出し、接続時の情報client.env.agentで伝える
削除 暗号化の検索で使うベータ版の問い合わせの種類と、非推奨だったtext_optsを削除
不具合の修正 maxPoolSize=0とminPoolSizeを一緒に指定すると、エラーになっていた
不具合の修正 空白を含む24文字の文字列から、短すぎるObjectIdが作られていた
不具合の修正 Python 3.11で、TLSのセッションの使い回しを止めた

PyPIの記録によると、4.20.0が必要とするPythonは3.11以上です。

AIのコーディングエージェントを検出するように

まずは、今回一番の話題から見ていきましょう。変更履歴によると、接続のときにサーバーへ送る情報に、検出したコーディングエージェントの名前が、client.env.agentとして含まれるようになりました。

コーディングエージェントとは、AIが自分でコードを書き、コマンドを実行しながら作業を進めるツールのことです。こうしたツールの中でPythonのプログラムを動かすと、PyMongoがそれに気づいて、サーバーに伝えるわけです。

どうやって見つけているのか

インストールされた4.20.0のコードを読むと、検出は環境変数を見て行っていました。特定の環境変数に値が入っていれば、その名前のエージェントの中で動いていると判断します。

見ている環境変数の例 伝えられる名前
CLAUDECODE claude_code
CURSOR_AGENT cursor
CODEX_SANDBOX codex_cli
GEMINI_CLI gemini_cli
AI_AGENT(どれにも当てはまらないとき) 値が1かtrueならai_agent、それ以外は値そのもの

コードには、ほかにもいくつかの名前が並んでいました。どれにも当てはまらない場合は、汎用のAI_AGENTという環境変数を最後に確かめる仕組みです。

環境変数そのものについては、こちらで紹介しています。【関連記事】環境変数とは?

4.19.0と4.20.0で確かめてみた

実際に、接続のときに送る情報を、サーバーにつなぐ前に取り出して確かめてみました。connect=Falseを付けると、MongoClientを作っても、すぐには接続しません。

import pymongo
from pymongo import MongoClient

client = MongoClient("mongodb://localhost:27017", connect=False)
meta = client.options.pool_options.metadata
print("env:", meta.get("env"))

ほかの環境変数の影響を受けないように、環境変数を空にしたうえで、試したい変数だけを付けて実行しました。手元のPython 3.11で、それぞれの版を新しい仮想環境に入れた結果です。

付けた環境変数 4.19.0 4.20.0
なし None None
AI_AGENT=1 None {'agent': 'ai_agent'}
CURSOR_AGENT=1 None {'agent': 'cursor'}

4.20.0では、環境変数に合わせて、エージェントの名前が接続の情報に加わるようになりました。何も付けなければ、これまでどおり何も送られません。

AI_AGENTに好きな名前を入れた場合も試しました。AI_AGENT=my-helperではmy-helperが、大文字のAI_AGENT=TRUEではai_agentが、そのまま送られる情報に入りました。

何のための機能なのか

送られる情報は、エージェントの名前だけです。変更履歴では理由までは説明されていませんが、データベースを提供する側が、AIのツールからどれくらい使われているかを把握できるようになると考えられます。

一方で、こうした情報が送られることを、気にする人もいるでしょう。自分のプログラムが、接続のときに何を送っているかは、一度確かめておくと安心です。

接続の数の設定の不具合が直った

続いて、初心者にも関係しそうな修正です。MongoClientには、サーバーとの接続を何本まで同時に持つかを決める、maxPoolSizeという設定があります。

変更履歴によると、maxPoolSize=0は上限なしという意味です。ところが、最低限持っておく接続の数minPoolSizeと一緒に指定すると、エラーになっていました。

試してみた

実際に、maxPoolSize=0とminPoolSize=5を一緒に指定して、MongoClientを作ってみました。

from pymongo import MongoClient

try:
    MongoClient("mongodb://localhost:27017", maxPoolSize=0, minPoolSize=5, connect=False)
    print("maxPoolSize=0, minPoolSize=5: 作成できた")
except ValueError as e:
    print("ValueError:", e)

実行した結果です。

PyMongo 4.19.0
ValueError: minPoolSize must be smaller or equal to maxPoolSize

PyMongo 4.20.0
maxPoolSize=0, minPoolSize=5: 作成できた

4.19.0では、上限なしのつもりの0と比べて、5のほうが大きいと判断されてしまっていました。4.20.0では、0とNoneを、どちらも上限なしとして扱うようになっています。

そのほかの修正

変更履歴には、ほかにも細かな修正が並んでいます。代表的なものを紹介します。

修正 中身
ObjectId 空白を含む24文字の文字列から、12バイトより短いObjectIdが作られていたのを、InvalidIdにするように
UUIDの変換 C言語の部分とPythonの部分で、長さの合わないUUIDの読み方が違っていたのをそろえた
非同期の接続 AsyncMongoClientが、レプリカセットの一部が再起動したあとに復帰できないことがあった
Python 3.11 CPythonのメモリリークを避けるため、TLSのセッションの使い回しを止めた

ObjectIdは、MongoDBが文書ごとに自動で付ける、12バイトのIDのことです。手元で、途中に空白を1つ入れた24文字の文字列を試したところ、4.19.0でも4.20.0でもInvalidIdになり、違いは確かめられませんでした。

4つ目について、変更履歴によると、このメモリリークはPython 3.12.7と3.13.1で直っています。Python 3.12や3.13を使っている方は、少なくともその版に上げるよう勧められています。

上げる前にやっておきたいこと

最後に、PyMongoを4.20.0へ上げる前に確かめておきたいことを整理します。

順番 確認すること
1 Python 3.11以上を使っているか
2 暗号化の検索で、ベータ版の問い合わせの種類やtext_optsを使っていないか
3 AIのコーディングエージェントの中で動かしているか、接続の情報を確かめる
4 Python 3.12や3.13なら、3.12.7や3.13.1以降を使っているか

PythonからSQLのデータベースを扱う方法と比べてみたい方は、SQLAlchemyの記事も参考になります。【関連記事】PythonのSQLAlchemyとは?

私は10年ほどエンジニアとして開発に関わってきましたが、データベースの接続の数の設定を誤って、混み合う時間帯にだけアプリが遅くなる問題に悩まされたことがあります。上限なしのつもりの設定がエラーになるような食い違いが直るのは、地味ですが大切な修正です。

まとめ

2026年11月12日、PyMongo 4.20.0が公開されました。AIのコーディングエージェントの中で動いていることを環境変数から見つけて、接続の情報で伝えるようになり、maxPoolSize=0とminPoolSizeを一緒に指定したときのエラーも直っています。

AIがコードを書いて動かすのが当たり前になりつつあることを、感じさせる変更です。自分のプログラムが送っている情報も、この機会に確かめてみてください。

ここまでお読みいただきありがとうございました。

参考情報

次のアクション

記事で学んだ内容を実際に動かしてみよう

Python WebAcademyでは、ブラウザ上でコードを書きながら基礎から実践まで体系的に学べます。

Python WebAcademyの学習画面

あわせて読む

関連記事

ブログ一覧へ

Python学習ロードマップ

まずはこの3講座から

記事で気になったテーマを、順番に手を動かしながら学べます。

ロードマップを見る