Overview
MongoDB 配置に接続するには、次の 2 つのものが必要です。
接続 URI ( 接続string とも呼ばれます)で、接続するPyMongo MongoDB配置を に指示します。
MongoDB 配置への接続を作成し、それに対して操作を実行できるようにするMongoClientオブジェクト。
また、これらのコンポーネントのいずれかを使用して、MongoDB に接続中の PyMongo の動作をカスタマイズすることもできます。
このガイドでは、接続string を作成し、{0MongoClient
オブジェクトを使用してMongoDB に接続する方法について説明します。
接続URI
標準の接続stringには次のコンポーネントが含まれます。
コンポーネント | 説明 |
---|---|
| 必須: これを標準接続形式の文字列として識別するプレフィックス。 |
| 任意。 認証資格情報。 これらを含めると、クライアントは |
| 必須。 MongoDB が実行されているホストとオプションのポート番号。 ポート番号を指定しない場合、ドライバーはデフォルトのポート |
| 任意。 接続stringに |
| 任意。 接続固有のオプションを |
接続 の作成の詳細については、string MongoDB Serverドキュメントの「 接続 文字列 」を参照してください。
MongoClient
MongoDB への接続を作成するには、接続 URI を string としてMongoClient
コンストラクターに渡します。 次の例では、ドライバーはサンプル接続 URI を使用して、 localhost
のポート27017
上の MongoDB インスタンスに接続します。
from pymongo import MongoClient uri = "mongodb://localhost:27017/" client = MongoClient(uri)
非同期アプリケーションを操作している場合は、 AsyncMongoClient
クラスを使用します。次の例は、AsyncMongoClient
オブジェクトを作成する方法を示しています。
from pymongo import AsyncMongoClient uri = "mongodb://localhost:27017/" client = AsyncMongoClient(uri)
次の表では、MongoClient()
コンストラクターが受け入れる位置指定パラメーターを説明しています。すべてのパラメーターは任意です。
Parameter | 説明 | ||
---|---|---|---|
| MongoDBデプロイのホスト名、 IPアドレス、または Unix ドメイン ソケット パス。アプリケーションがレプリカセットまたはシャーディングされたクラスターに接続する場合は、 Pythonリストで複数のホスト名またはIPアドレスを指定できます。 リテラルの IPv6 アドレスを渡す場合は、アドレスを角括弧で囲む必要があります( PyMongo doesn't support multihomed and round-robin DNS addresses. データ型: | ||
| MongoDB Server が実行中いるポート番号。 このパラメータを使用する代わりに、 データ型: | ||
| クエリによって返されたBSONドキュメントをデコードするためにクライアントが使用するデフォルトのクラス。このパラメーターは次の型を受け入れます。
データ型: | ||
| このパラメータが For more information about aware and naive データ型: | ||
| このパラメータが If your application is running in a function-as-a-service (FaaS) environment, the default value is データ型: | ||
| カスタム型のエンコードとデコードを有効にする データ型: TypeRegistry |
You can also pass keyword arguments to the MongoClient()
constructor to specify optional parameters. For a complete list of keyword arguments, see the MongoClient class in the API documentation.
同時実行
次のセクションでは、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
オブジェクトに型の注釈を追加する必要があります。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
from pymongo import MongoClient client: MongoClient = MongoClient()
from pymongo import AsyncMongoClient client: AsyncMongoClient = AsyncMongoClient()
より正確な型情報については、型注釈にジェネリックドキュメント型 Dict[str, Any]
を含めることができます。このデータ型は、 MongoDB内のすべてのドキュメントと一致します。次の例では、このデータ型を型注釈 に含める方法を示しています。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
from pymongo import MongoClient from typing import Any, Dict client: MongoClient[Dict[str, Any]] = MongoClient()
from pymongo import AsyncMongoClient from typing import Any, Dict client: AsyncMongoClient[Dict[str, Any]] = AsyncMongoClient()
操作するすべてのドキュメントが単一のカスタムタイプに対応する場合は、MongoClient
オブジェクトのタイプヒントとしてカスタムタイプを指定できます。これにより、汎用の Dict[str, Any]
型よりも正確な型情報が提供されます。
次の例は、MongoClient
オブジェクトの型のヒントとして Movie
型を指定する方法を示しています。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
from typing import TypedDict class Movie(TypedDict): name: str year: int client: MongoClient[Movie] = MongoClient()
from typing import TypedDict class Movie(TypedDict): name: str year: int client: AsyncMongoClient[Movie] = AsyncMongoClient()
Closing a MongoClient
During garbage collection, PyMongo automatically cleans up application-side resources used by a MongoClient
instance. However, PyMongo does not guarantee the closure of server-side resources such as open cursors or sessions. You can ensure that PyMongo closes these resources by calling the close()
method on your MongoClient
instance when you are done using it, as shown in the following example:
client.close()
You can also instantiate the client in a with
statement, as shown in the following example. The client automatically closes when the block terminates.
with MongoClient("mongodb://localhost:27017/") as client: db = client.get_database("mydatabase") # Perform further client operations here
トラブルシューティング
MongoClient が ConfigurationError に失敗
無効なキーワード引数名を指定すると、ドライバーはこのエラーを発生させます。
指定したキーワード引数が存在し、正しくスペルされていることを確認します。
プロセスをフォークするとデッドロックが発生する
A MongoClient
instance spawns multiple threads to run background tasks, such as monitoring connected servers. These threads share state that is protected by instances of the threading.Lock
class, which are themselves not fork-safe. PyMongo is subject to the same limitations as any other multithreaded code that uses the threading.Lock
class, or any mutexes.
これらの制限の 1 つは、 fork()
メソッドを呼び出した後にロックが使用できなくなることです。 fork()
が実行されると、ドライバーは親プロセスのすべてのロックを、親と同じ状態で子プロセスにコピーします。 親プロセスでロックされている場合は、子プロセスでもロックされます。 fork()
によって作成された子プロセスにはスレッドが 1 つしかないため、親プロセスの他のスレッドによって作成されたロックは、子プロセスでは解放されません。 子プロセスが次にこれらのロックのいずれかを取得しようとすると、デッドロックが発生します。
Starting in PyMongo version 4.3, after you call the os.fork()
method, the driver uses the os.register_at_fork()
method to reset its locks and other shared state in the child process. Although this reduces the likelihood of a deadlock, PyMongo depends on libraries that aren't fork-safe in multithreaded applications, including OpenSSL and getaddrinfo(3). Therefore, a deadlock can still occur.
The Linux manual page for fork(2) also imposes the following restriction:
After a
fork()
in a multithreaded program, the child can safely call only async-signal-safe functions (see signal-safety(7)) until such time as it calls execve(2).
PyMongo は非同期シグナルセーフでない関数に依存しているため、子プロセスで実行するとデッドロックやクラッシュが発生する可能性があります。
Tip
For an example of a deadlock in a child process, see PYTHON-3406 in Jira.
For more information about the problems caused by Python locks in multithreaded contexts with fork()
, see Issue 6721 in the Python Issue Tracker.
クライアント タイプの注釈
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 ドキュメントを参照してください。