接続ターゲットの選択
項目一覧
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)
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.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
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 ドキュメントを参照してください。