MongoClient の作成
項目一覧
Overview
MongoDB 配置に接続するには、次の 2 つのものが必要です。
接続 URI ( 接続string とも呼ばれます)で、接続するPyMongo MongoDB配置を に指示します。
MongoDB 配置への接続を作成し、それに対して操作を実行できるようにするMongoClientオブジェクト。
また、これらのコンポーネントのいずれかを使用して、MongoDB に接続中の PyMongo の動作をカスタマイズすることもできます。
このガイドでは、接続stringを作成し、MongoClient
オブジェクトを使用してMongoDBに接続する方法について説明します。
接続URI
標準の接続stringには次のコンポーネントが含まれます。
コンポーネント | 説明 |
---|---|
| 必須: これを標準接続形式の文字列として識別するプレフィックス。 |
| 任意。 認証資格情報。 これらを含めると、クライアントは |
| 必須。 MongoDB が実行されているホストとオプションのポート番号。 ポート番号を指定しない場合、ドライバーはデフォルトのポート |
| 任意。 接続stringに |
| 任意。 接続固有のオプションを |
接続 の作成の詳細については、stringMongoDB Server ドキュメントの「 接続 文字列 」を参照してください。
MongoClient
MongoDB への接続を作成するには、接続 URI を string としてMongoClient
コンストラクターに渡します。 次の例では、ドライバーはサンプル接続 URI を使用して、 localhost
のポート27017
上の MongoDB インスタンスに接続します。
from pymongo import MongoClient uri = "mongodb://localhost:27017/" client = MongoClient(uri)
次の表では、MongoClient()
コンストラクターが受け入れる位置指定パラメーターを説明しています。すべてのパラメーターは任意です。
Parameter | 説明 | ||
---|---|---|---|
| MongoDBデプロイのホスト名、 IPアドレス、または Unix ドメイン ソケット パス。アプリケーションがレプリカセットまたはシャーディングされたクラスターに接続する場合は、 Pythonリストで複数のホスト名またはIPアドレスを指定できます。 リテラルの IPv6 アドレスを渡す場合は、アドレスを角括弧で囲む必要があります( PyMongo は、マルチホスト および ラウンド ログ DNS アドレスをサポートしていません。 データ型: | ||
| MongoDB Server が実行中いるポート番号。 このパラメータを使用する代わりに、 データ型: | ||
| クエリによって返されたBSONドキュメントをデコードするためにクライアントが使用するデフォルトのクラス。このパラメーターは次の型を受け入れます。
データ型: | ||
| このパラメータが 認識済みおよびネイティブの データ型: | ||
| このパラメータが アプリケーションがFaaS(function-as-a-service)環境で実行中いる場合、デフォルト値は データ型: | ||
| カスタム型のエンコードとデコードを有効にする データ型: TypeRegistry |
また、MongoClient()
コンストラクターにキーワード引数を渡して、任意のパラメータを指定することもできます。キーワード引数の完全なリストについては、 APIドキュメントの MongoClientクラスを参照してください。
同時実行
次のセクションでは、PyMongo の同時実行メカニズムのサポートについて説明します。
マルチスレッド
PyMongoはスレッドセーフで、スレッド アプリケーション用の組み込み接続プーリングを提供します。各 MongoClient
オブジェクトはデータベースへの接続のプールを表すため、ほとんどのアプリケーションでは、複数のリクエスト間でも MongoClient
のインスタンスが 1 つだけ必要になります。
複数のフォーク
PyMongo は、fork()
メソッドを呼び出して新しいプロセスを作成することをサポートしています。ただし、プロセスをフォークする場合は、子プロセスに新しい MongoClient
インスタンスを作成する必要があります。
重要
子プロセスに MongoClient を渡さないでください
fork()
メソッドを使用して新しいプロセスを作成する場合は、親プロセスから子プロセスに MongoClient
クラスのインスタンスを渡さないでください。これにより、子プロセス内の MongoClient
インスタンス間でデッドロックが発生する可能性が高くなります。このデッドロックが発生する可能性がある場合、 PyMongo は警告の発行を試みます。
フォークされたプロセスでのデッドロックの詳細については、「プロセスをフォークするとデッドロックが発生する」を参照してください。
マルチプロセシング
PyMongo はPython multiprocessing
モジュールをサポートしています。ただし、Unix システムでは、マルチプロセシング モジュールは fork()
メソッドを使用してプロセスを生成します。これは、複数ノードで説明されているのと同じリスクを伴います。
PyMongo でマルチプロセシングを使用するには、次の例のようなコードを記述します。
# Each process creates its own instance of MongoClient. def func(): db = pymongo.MongoClient().mydb # Do something with db. proc = multiprocessing.Process(target=func) proc.start()
重要
MongoClient
クラスのインスタンスを親プロセスから子プロセスにコピーしないでください。
型ヒント
アプリケーションでPython3.5 以降を使用している場合は、 PHP で説明されているように、 型のヒント 484をコードに追加できます。型のヒントは、変数、パラメータ、関数の戻り値のデータ型とドキュメントの構造を示します。一部の IDE では、 型ヒント を使用してコードの型エラーをチェックし、コード完了のための適切なオプションを提案できます。
PyMongoアプリケーションで型のヒントを使用するには、次の例に示すように、MongoClient
オブジェクトに型の注釈を追加する必要があります。
client: MongoClient = MongoClient()
より正確な型情報については、型注釈にジェネリックドキュメント型 Dict[str, Any]
を含めることができます。このデータ型は、 MongoDB内のすべてのドキュメントと一致します。次の例は、このデータ型を型注釈 に含める方法を示しています。
from typing import Any, Dict client: MongoClient[Dict[str, Any]] = MongoClient()
操作するすべてのドキュメントが単一のカスタムタイプに対応する場合は、MongoClient
オブジェクトのタイプヒントとしてカスタムタイプを指定できます。これにより、汎用の Dict[str, Any]
型よりも正確な型情報が提供されます。
次の例は、MongoClient
オブジェクトの型のヒントとして Movie
型を指定する方法を示しています。
from typing import TypedDict class Movie(TypedDict): name: str year: int client: MongoClient[Movie] = MongoClient()
トラブルシューティング
MongoClient が ConfigurationError に失敗
無効なキーワード引数名を指定すると、ドライバーはこのエラーを発生させます。
指定したキーワード引数が存在し、正しくスペルされていることを確認します。
プロセスをフォークするとデッドロックが発生する
MongoClient
インスタンスは、接続されたサーバーの監視などのバックグラウンド タスクを実行するために複数のスレッドを生成します。 これらのスレッドは、 フォークセーフではない クラスのインスタンスによって保護されている状態を共有しますthreading.Lock
。PyMongo には、 threading.Lock
クラスまたはミューテックスを使用する他のマルチスレッド コードと同じ制限が適用されます。
これらの制限の 1 つは、 fork()
メソッドを呼び出した後にロックが使用できなくなることです。 fork()
が実行されると、ドライバーは親プロセスのすべてのロックを、親と同じ状態で子プロセスにコピーします。 親プロセスでロックされている場合は、子プロセスでもロックされます。 fork()
によって作成された子プロセスにはスレッドが 1 つしかないため、親プロセスの他のスレッドによって作成されたロックは、子プロセスでは解放されません。 子プロセスが次にこれらのロックのいずれかを取得しようとすると、デッドロックが発生します。
PyMongo バージョン4.3以降では、 os.fork()
メソッドを呼び出すと、ドライバーはos.register_at_fork()
メソッドを使用して子プロセス内のロックやその他の共有状態をリセットします。 これによりデッドロックの可能性は減りますが、PyMongo は OpenSSL などのマルチスレッド アプリケーションではフォークセーフでないライブラリに依存しています と getaddrinfo(3 ) 。そのため、デッドロックは引き続き発生する可能性があります。
fork の Linux マニュアルページ(2 ) また、次の制限も課されます。
fork()
マルチスレッド プログラムで の後、子は非同期シグナルセーフな関数のみを安全に呼び出せるようになります( シグナルセーフ(7 ) を参照してください )を、 execVE(2 )を呼び出すまで。
PyMongo は非同期シグナルセーフでない関数に依存しているため、子プロセスで実行するとデッドロックやクラッシュが発生する可能性があります。
Tip
子プロセスにおけるデッドロックの例については、 Python-3406 を参照してください。 Jira の。
を使用したマルチスレッド コンテキストでの ロックが発生する問題の詳細については、「 の問題Python 」を参照してください。fork()
を指定します。6721Python
クライアント タイプの注釈
MongoClient
オブジェクトに型注釈を追加しない場合、型チェッカーに次のようなエラーが表示される場合があります。
from pymongo import MongoClient client = MongoClient() # error: Need type annotation for "client"
解決策としては、MongoClient
オブジェクトを client: MongoClient
または client: MongoClient[Dict[str, Any]]
として注釈を付けることです。
互換性のないタイプ
型のヒントとして MongoClient
を指定しているが、ドキュメント、キー、値のデータ型を含めない場合、型チェッカーに次のようなエラーが表示される場合があります。
error: Dict entry 0 has incompatible type "str": "int"; expected "Mapping[str, Any]": "int"
解決策としては、次のタイプのヒントを MongoClient
オブジェクトに追加することです。
``client: MongoClient[Dict[str, Any]]``
API ドキュメント
PyMongo でMongoClient
オブジェクトを作成する方法の詳細については、次の API ドキュメントを参照してください。