AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

接続ターゲットの選択

このガイドでは、接続stringと MongoClient オブジェクトを使用して、さまざまなタイプのMongoDB配置に接続する方法を説明します。

MongoDBAtlas上の 配置に接続するには、 接続string に次の要素を含めます。

  • Atlas クラスターの URL

  • MongoDB ユーザー名

  • MongoDB パスワード

次に、接続stringを MongoClient コンストラクターに渡します。

Tip

Atlas ドライバー接続ガイドに従って接続文字列を取得します。

Atlas に接続するときは、Atlas が MongoDB Server の新しいバージョンにアップグレードするときに重大な変更を回避するために、 Stable API クライアント オプションを使用することをお勧めします。 Stable API 機能について詳しくは、「 Stable API 」ページをご覧ください。

以下のコードは、 PyMongoを使用して Atlas クラスターに接続する方法を示しています。このコードでは、Stable APIバージョンを指定するために server_api オプションも使用されます。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。

from pymongo import MongoClientfrom pymongo.server_api import ServerApi # Replace the placeholder with your Atlas connection stringuri = "<connection string>" # Create a MongoClient with a MongoClientOptions object to set the Stable API versionclient = MongoClient(uri, server_api=ServerApi( version='1', strict=True, deprecation_errors=True)) try: # Connect the client to the server (optional starting in v4.7) client.connect() # Send a ping to confirm a successful connection client.admin.command({'ping': 1}) print("Pinged your deployment. You successfully connected to MongoDB!") finally: # Ensures that the client will close when you finish/error client.close()

MongoDB のローカル配置に接続するには、ホスト名としてlocalhostを使用します。 デフォルトでは、 mongodプロセスはポート27017で実行されますが、これは配置に合わせてカスタマイズできます。

ローカル Atlas 配置の場合、atlas-local-lib-py ライブラリを使用して、Docker を介してローカル配置をプログラムで作成、管理、接続できます。このアプローチにより配置マネジメントが簡素化され、接続文字列が自動的に検索されます。

ライブラリをインストールするには、次のコマンドを実行します。

pip install atlas-local-lib-py

以下のコードは、PyMongo で atlas-local-lib-py を使用してローカル Atlas 配置を作成または再利用して接続する方法を示しています。対応するコードを表示するには、Synchronous タブまたは Asynchronous タブを選択します。

from pymongo import MongoClientfrom atlas_local import LocalDeployment # Create or reuse a local Atlas deploymentdeployment = LocalDeployment.get_or_create( name="my-local-deployment") # Get the connection string and connecturi = deployment.connection_string()client = MongoClient(uri)

atlas-local-lib-py の詳細については、atlas-local-lib-py リポジトリ を参照してください。

または、接続文字列を直接指定することで、ローカル MongoDB 配置に手動で接続できます。

以下のコードは、PyMongo を使用してデフォルト ポートで実行されているローカル MongoDB 配置に接続する方法を示しています。対応するコードを表示するには、Synchronous タブまたは Asynchronous タブを選択します。

from pymongo import MongoClient uri = "mongodb://localhost:27017/"client = MongoClient(uri)

レプリカセットに接続するには、IP 接続 でレプリカセットのホスト名(またはstring アドレス)とポート番号を指定します。

以下のコードは、 PyMongoを使用して 3 つのホストを含むレプリカセットに接続する方法を示しています。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。

from pymongo import MongoClient client = MongoClient("mongodb://host1:27017,host2:27017,host3:27017")

レプリカセット内のホストの完全なリストを提供できない場合は、レプリカセット内の 1 つ以上のホストを指定し、PyMongo に自動検出を実行して他のホストを検索するように指示できます。 ドライバーに自動検出を実行するように指示するには、次のいずれかのアクションを実行します。

  • replicaSet パラメーターの値としてレプリカセットの名前を指定します。

  • directConnection パラメーターの値として false を指定します。

  • レプリカセットに複数のホストを指定します。

次の例では、ドライバーはサンプル接続 URI を使用して、host1 を含む 3 つの異なるホストのポート 27017 で実行中いるMongoDBレプリカセットsampleRS に接続します。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。

from pymongo import MongoClient uri = "mongodb://host1:27017/?replicaSet=sampleRS"client = MongoClient(uri)

注意

Docker のレプリカセット

レプリカセットがDockerで実行される場合、公開されるMongoDBエンドポイントは 1 つだけです。この場合、レプリカセットは検出できません。接続 URI で directConnection=false を指定するか、このオプションを未設定のままにすると、アプリケーションがその接続に接続できなくなる可能性があります。

テスト環境または開発環境では、directConnection=true を指定してレプリカセットに接続できます。本番環境では、Docker 仮想ネットワークの外部から各 MongoDB インスタンスにアクセスできるようにクラスターを構成することを推奨します。

PyMongo は、クライアントの localThresholdMS 値内にアクセス可能な配置全体で操作を均等に負荷分散します。 PyMongo が複数のMongoDB配置にわたって操作を負荷分散する方法の詳細については、 カスタマイズされたサーバー選択のガイドを参照してください。

注意

MongoClientコンストラクターは非ブロッキングです。 レプリカセットに接続すると、クライアントがバックグラウンド スレッドを使用してレプリカセットに接続している間に、コンストラクターはすぐに返します。

MongoClientを作成し、そのnodes属性の string 表現をすぐに出力すると、クライアントがレプリカセット メンバーに接続している間はリストが空になることがあります。

レプリカセットを初期化するには、単一のノードに直接接続する必要があります。 そのためには、 directConnection接続オプションをTrueに設定します。 これは、MongoClient コンストラクターに引数を渡す方法と、 接続stringのパラメーターを使用する方法の 2 つがあります。

from pymongo import MongoClient client = MongoClient("mongodb://<hostname>:<port>", directConnection=True)

DNS サービス検出を使用して接続しているサービスの DNS SRVレコードを検索するには、接続文字列で SRV 接続形式を指定します。 さらに、 SRV 接続形式を有効にすると、 PyMongo はクライアント構成を変更しなくても、新しいホストの再スキャンを自動的に再スキャンします。

次のコードは、 SRV 接続形式を使用する接続文字列を示しています。

uri = "mongodb+srv://<hostname>/"

SRV 接続形式の詳細については、 MongoDB Serverマニュアルの「 SRV 接続形式 」のエントリを参照してください。

MongoDB Server v 3.6またはそれ以前のバージョンに接続しようとすると、PyMongo は次のエラーを発生させる可能性があります。

pymongo.errors.ConfigurationError: Server at localhost:27017 reports wire version 6, but this version of PyMongo requires at least 7 (MongoDB 4.0).

これは、接続先のサーバーに対してドライバーのバージョンが新しすぎる場合に発生します。 この問題を解決するには、次のいずれかを実行します。

  • MongoDBデプロイをv4.0 以降にアップグレードします。

  • MongoDB Server v3.6 以降をサポートするPyMongo 4.10 またはそれ以前のバージョンにダウングレードします。

  • PyMongo v3.x にダウングレードし、 MongoDB Server v2.6 以降をサポートします。

AutoReconnectの例外は、フェイルオーバーが発生したことを示します。 これは、PyMongo がレプリカセットの元のプライマリ メンバーへの接続を失い、最後の操作が失敗した可能性があることを意味します。

このエラーが発生すると、PyMongo は自動的に後続の操作のために新しいプライマリ メンバーを検索しようとします。 エラーを処理するには、アプリケーションは次のいずれかのアクションを実行する必要があります。

  • 失敗した可能性のある操作を再試行する

  • 操作が失敗した可能性を認識しながら実行を続行

重要

PyMongo は、レプリカセットが新しいプライマリ メンバーを選出するまで、すべての操作でAutoReconnectエラーを発生させます。

SSH トンネル経由で MongoDB レプリカセットに接続しようとすると、次のエラーが表示されます。

File "/Library/Python/2.7/site-packages/pymongo/collection.py", line 1560, in count return self._count(cmd, collation, session) File "/Library/Python/2.7/site-packages/pymongo/collection.py", line 1504, in _count with self._socket_for_reads() as (connection, slave_ok): File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/contextlib.py", line 17, in __enter__ return self.gen.next() File "/Library/Python/2.7/site-packages/pymongo/mongo_client.py", line 982, in _socket_for_reads server = topology.select_server(read_preference) File "/Library/Python/2.7/site-packages/pymongo/topology.py", line 224, in select_server address)) File "/Library/Python/2.7/site-packages/pymongo/topology.py", line 183, in select_servers selector, server_timeout, address) File "/Library/Python/2.7/site-packages/pymongo/topology.py", line 199, in _select_servers_loop self._error_message(selector))pymongo.errors.ServerSelectionTimeoutError: localhost:27017: timed out

これは、PyMongo が他のレプリカセット ノードのアドレスとポートを含むisMasterコマンドの応答を使用してレプリカセット ノードを検出するために発生します。 ただし、SSH トンネル経由でこれらのアドレスとポートにアクセスすることはできません。

代わりに、SSH トンネルでdirectConnection=Trueオプションを使用することで、単一の MongoDB ノードに直接接続できます。

PyMongo でMongoClientオブジェクトを作成する方法の詳細については、次の API ドキュメントを参照してください。