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がコードを書いて動かすのが当たり前になりつつあることを、感じさせる変更です。自分のプログラムが送っている情報も、この機会に確かめてみてください。
ここまでお読みいただきありがとうございました。