Docs Menu

接続ターゲットの選択

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

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 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 ドキュメントを参照してください。