データベースコマンドの実行
Overview
このガイドでは、 PyMongoを使用してデータベースコマンドを実行する方法を学習できます。 データベースコマンドを使用して、サーバー統計の取得、レプリカセットを初期化、集計パイプラインの実行中など、さまざまな管理および診断タスクを実行できます。
重要
データベース コマンドよりもライブラリ メソッドを優先
ライブラリは、多くのデータベースコマンドのラッパーメソッドを提供します。 可能な場合は、データベースコマンドを実行する代わりにこれらのメソッドを使用することをお勧めします。
管理タスクを実行するには、 PyMongoの代わりに MongoDB Shell を使用します。shellシェルは、ドライバーでは使用できない可能性のあるヘルパーメソッドを提供します。
ライブラリまたはシェルに使用できるヘルパーがない場合は、このガイドで説明されている {0 シェルメソッドまたはドライバーのshell メソッドを使用できます。db.runCommand()
shellcommand()
コマンドの実行
command()
メソッドを使用してデータベースコマンドを実行できます。コマンドと関連する引数を指定する必要があります。 コマンドが単純な場合、これらは string として渡すことができます。 それ以外の場合は、dict
オブジェクトとして渡すことができます。メソッドは、実行されたコマンドの結果を返します。
次のコードは、Database
で command()
メソッドを使用して hello
コマンドを実行する方法を示しています。これは、サーバーに関する情報を返します。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
database = client.get_database("my_db") hello = database.command("hello") print(hello)
{ 'topologyVersion': { 'processId': ObjectId('...'), 'counter': 6 }, 'hosts': [...], 'setName': '...', 'setVersion': 114, 'isWritablePrimary': True, 'secondary': False, 'primary': '...', 'tags': {...}, 'me': '...', 'electionId': ..., 'lastWrite': {...}, 'maxBsonObjectSize': 16777216, 'maxMessageSizeBytes': 48000000, 'maxWriteBatchSize': 100000, 'localTime': ..., 'logicalSessionTimeoutMinutes': 30, 'connectionId': ..., 'minWireVersion': 0, 'maxWireVersion': 21, 'readOnly': False, 'ok': 1.0, '$clusterTime': {...}, 'operationTime': ... }
database = client.get_database("my_db") hello = await database.command("hello") print(hello)
{ 'topologyVersion': { 'processId': ObjectId('...'), 'counter': 6 }, 'hosts': [...], 'setName': '...', 'setVersion': 114, 'isWritablePrimary': True, 'secondary': False, 'primary': '...', 'tags': {...}, 'me': '...', 'electionId': ..., 'lastWrite': {...}, 'maxBsonObjectSize': 16777216, 'maxMessageSizeBytes': 48000000, 'maxWriteBatchSize': 100000, 'localTime': ..., 'logicalSessionTimeoutMinutes': 30, 'connectionId': ..., 'minWireVersion': 0, 'maxWireVersion': 21, 'readOnly': False, 'ok': 1.0, '$clusterTime': {...}, 'operationTime': ... }
データベースコマンドと対応するパラメータの完全なリストについては、「追加情報 」セクションを参照してください。
コマンドカーソル
command()
メソッドは、実行されたコマンドの結果を返します。また、cursor_command()
MongoDBコマンドを発行し、その応答を コマンドCursor として解析する メソッドを使用することもできます。CommandCursor
はコマンドの結果を反復処理するために使用できます。
次の例では sample_mflix
データベースで cursor_command()
メソッドを使用します。 movies
コレクションで find
コマンドを実行し、runtime
フィールドの値が 11
のドキュメントをフィルタリングします。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
database = client.get_database("sample_mflix") result = database.cursor_command("find", "movies", filter={"runtime": 11}) print(result.to_list())
{ '_id': ObjectId(...), 'runtime': 11, 'title': 'The Great Train Robbery', ... }, { {'_id': ObjectId(...), 'runtime': 11, 'title': 'Glas', ... }, ...
database = client.get_database("sample_mflix") result = await database.cursor_command("find", "movies", filter={"runtime": 11}) print(result.to_list())
{ '_id': ObjectId(...), 'runtime': 11, 'title': 'The Great Train Robbery', ... }, { {'_id': ObjectId(...), 'runtime': 11, 'title': 'Glas', ... }, ...
コマンドの応答形式の詳細については、「 データベースコマンド 」を参照してください。
注意
読み込み設定 (read preference)
command()
メソッドと cursor_command()
メソッドは、コード内の他の場所にある Database
インスタンスに設定した読み込み設定 (read preference)に従いません。ClientSession がsession
パラメータを使用して提供され、かつこのセッションが トランザクション 内にある場合、コマンドの読み込み設定 (read preference)(read preference) はトランザクションの読み込み設定 (read preference)) に設定されます。それ以外の場合、コマンドの読み込み設定( 読み込み設定 (read preference) )はデフォルトで PRIMARY
になります。
コマンド実行の読み込み設定 (read preference)を設定するには、read_preference
パラメータを使用します。 (例: )。
from pymongo.read_preferences import Secondary database = client.get_database("my_db") hello = database.command("hello", read_preference=Secondary()) print(hello)
read_preferences
APIドキュメントの モジュールの詳細については、こちらを参照してください。
読み込み設定( 読み込み設定 (read preference) )オプションの詳細については、 MongoDB Serverマニュアルの読み込み設定(read preference) を参照してください。
コマンドの例
次の例では、command()
メソッドを使用して dbStats
コマンドを実行し、sample_mflix
データベースのストレージ統計を取得します。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
database = client.get_database("sample_mflix") result = database.command("dbStats") print(result)
{'db': 'sample_mflix', 'collections': 9, 'views': 1, 'objects': 67662, 'avgObjSize': 1796.788182436227, 'dataSize': 121574282, 'storageSize': 97779712, 'totalFreeStorageSize': 0, 'numExtents': 0, 'indexes': 13, 'indexSize': 19423232, 'indexFreeStorageSize': 0, 'fileSize': 0, 'nsSizeMB': 0, 'ok': 1}
database = client.get_database("sample_mflix") result = await database.command("dbStats") print(result)
{'db': 'sample_mflix', 'collections': 9, 'views': 1, 'objects': 67662, 'avgObjSize': 1796.788182436227, 'dataSize': 121574282, 'storageSize': 97779712, 'totalFreeStorageSize': 0, 'numExtents': 0, 'indexes': 13, 'indexSize': 19423232, 'indexFreeStorageSize': 0, 'fileSize': 0, 'nsSizeMB': 0, 'ok': 1}
このコマンドの出力には、データベースの コレクション に関する情報が含まれ、コレクション全体に保存されるデータの量とサイズが示されます。
型ヒント
Database.command()
メソッドは、返されたBSONドキュメントを特定のクラスのインスタンスにデコードできます。このクラスを指定するには、CodecOptions
オブジェクトを作成し、クラス名を渡します。クラスは次のいずれかのタイプになります。
bson.raw_bson.RawBSONDocument
。RawBSONDocument
クラスの詳細については、未加工BSONデータの操作 を参照してください。collections.abc.Mapping
型のサブクラス(OrderedDict
など)。型チェック ルールの厳密性によっては、キーと値の型を指定する必要がある場合もあります。TypedDict
型のサブクラス。このパラメータにTypedDict
サブクラスを渡すには、CodecOptions
オブジェクトの型ヒントにクラスを含める必要があります。
注意
Python 3.7 以前の TypedDiction
TypedDictionクラスは typing
モジュールにあります。このモジュールはPython 3.8 以降でのみ利用可能です。Pythonの以前のバージョンで TypedDict
クラスを使用するには、 mapping_extentionsパッケージをインストールします。
次の例では、ping
コマンドによって返されたBSONを RawBSONDocument
クラスのインスタンスにデコードします。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
from pymongo import MongoClient from bson.raw_bson import RawBSONDocument from bson import CodecOptions client: MongoClient = MongoClient() options = CodecOptions(RawBSONDocument) result = client.admin.command("ping", codec_options=options)
from pymongo import AsyncMongoClient from bson.raw_bson import RawBSONDocument from bson import CodecOptions client: AsyncMongoClient = AsyncMongoClient() options = CodecOptions(RawBSONDocument) result = await client.admin.command("ping", codec_options=options)
BSON をTypedDict
クラスのサブクラスにデコードするには、次の例に示すように、CodecOptions
型のヒントでクラス名を指定します。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
from pymongo import MongoClient from bson.raw_bson import RawBSONDocument from bson import CodecOptions from typing import TypedDict class Movie(TypedDict): name: str year: int client: MongoClient = MongoClient() options: CodecOptions[Movie] = CodecOptions(Movie) result = client.admin.command("ping", codec_options=options)
from pymongo import AsyncMongoClient from bson.raw_bson import RawBSONDocument from bson import CodecOptions from typing import TypedDict class Movie(TypedDict): name: str year: int client: AsyncMongoClient = AsyncMongoClient() options: CodecOptions[Movie] = CodecOptions(Movie) result = await client.admin.command("ping", codec_options=options)
トラブルシューティング
クライアント タイプの注釈
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]]``
詳細情報
このガイドの概念の詳細については、 MongoDB Serverマニュアルの次のドキュメントを参照してください。
API ドキュメント
command()
メソッドと cursor_command()
メソッドの詳細については、次のPyMongo APIドキュメントを参照してください。