Overview
このガイドでは、接続string と {0MongoClient オブジェクトを使用して、さまざまなタイプのMongoDB 配置に接続する方法を説明します。
Atlas
MongoDBAtlas上の 配置に接続するには、 接続string に次の要素を含めます。
Atlas クラスターの URL
MongoDB ユーザー名
MongoDB パスワード
次に、接続stringを MongoClient コンストラクターに渡します。
Tip
接続 Atlasを取得するには、 ドライバー接続ガイドstring に従ってください。
Atlas に接続するときは、Atlas が MongoDB Server の新しいバージョンにアップグレードするときに重大な変更を回避するために、 Stable API クライアント オプションを使用することをお勧めします。 Stable API 機能について詳しくは、 Stable API ページ をご覧ください。
以下のコードは、PyMongo を使用して Atlas クラスターに接続する方法を示しています。 このコードでは、Stable API バージョンを指定するためにserver_apiオプションも使用されます。
from pymongo import MongoClient from pymongo.server_api import ServerApi # Replace the placeholder with your Atlas connection string uri = "<connection string>" # Create a MongoClient with a MongoClientOptions object to set the Stable API version client = 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で実行されますが、これは配置に合わせてカスタマイズできます。
以下のコードは、PyMongo を使用してローカル MongoDB 配置に接続する方法を示しています。
from pymongo import MongoClient uri = "mongodb://localhost:27017/" client = MongoClient(uri)
レプリカセット
レプリカセットに接続するには、IP 接続 でレプリカセットのホスト名(またはstring アドレス)とポート番号を指定します。
次のコードは、 PyMongo を使用して 3 つのホストを含むレプリカセットに接続する方法を示しています。
from pymongo import MongoClient client = MongoClient("mongodb://host1:27017,host2:27017,host3:27017")
レプリカセット内のホストの完全なリストを提供できない場合は、レプリカセット内の 1 つ以上のホストを指定し、PyMongo に自動検出を実行して他のホストを検索するように指示できます。 ドライバーに自動検出を実行するように指示するには、次のいずれかのアクションを実行します。
replicaSetパラメーターの値としてレプリカセットの名前を指定します。directConnectionパラメーターの値としてfalseを指定します。レプリカセットに複数のホストを指定します。
次の例では、ドライバーはサンプル接続 URI を使用して、host1 を含む 3 つの異なるホストのポート 27017 で実行されている MongoDB レプリカセット sampleRS に接続します。
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)
from pymongo import MongoClient uri = ("mongodb://<hostname>:<port>/?" "directConnection=true") client = MongoClient(uri)
DNS サービス検出
DNS サービス検出を使用して接続しているサービスの DNS SRVレコードを検索するには、接続文字列で SRV 接続形式を指定します。 さらに、 SRV 接続形式を有効にすると、 PyMongo はクライアント構成を変更しなくても、新しいホストの再スキャンを自動的に再スキャンします。
次のコードは、 SRV 接続形式を使用する接続文字列を示しています。
uri = "mongodb+srv://<hostname>/"
SRV 接続形式の詳細については、 MongoDB Serverマニュアルの「 SRV 接続形式 」のエントリを参照してください。
トラブルシューティング
サーバーはワイヤバージョン X を報告、PyMongo は Y が必要です
MongoDB Server v 3.4またはそれ以前のバージョンに接続しようとすると、PyMongo は次のエラーを発生させる可能性があります。
pymongo.errors.ConfigurationError: Server at localhost:27017 reports wire version 5, but this version of PyMongo requires at least 6 (MongoDB 3.6).
これは、接続先のサーバーに対してドライバーのバージョンが新しすぎる場合に発生します。 この問題を解決するには、MongoDB の配置を v 3.6以降にアップグレードするか、MongoDB Server v 2.6以降をサポートする PyMongo v 3 .x にダウングレードします。
AutoReconnect
AutoReconnectの例外は、フェイルオーバーが発生したことを示します。 これは、PyMongo がレプリカセットの元のプライマリ メンバーへの接続を失い、最後の操作が失敗した可能性があることを意味します。
このエラーが発生すると、PyMongo は自動的に後続の操作のために新しいプライマリ メンバーを検索しようとします。 エラーを処理するには、アプリケーションは次のいずれかのアクションを実行する必要があります。
失敗した可能性のある操作を再試行する
操作が失敗した可能性を認識しながら実行を続行
重要
PyMongo は、レプリカセットが新しいプライマリ メンバーを選出するまで、すべての操作でAutoReconnectエラーを発生させます。
トンネルを使用して PyMongo から MongoDB にアクセスする際のタイムアウト
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 ノードに直接接続できます。
API ドキュメント
PyMongo でMongoClientオブジェクトを作成する方法の詳細については、次の API ドキュメントを参照してください。