データベースとコレクション
Overview
このガイドでは、PyMongo で MongoDB のデータベースとコレクションを使用する方法を学習できます。
MongoDB では、データは次のレベルの階層に整理されています。
データベース: MongoDB インスタンス内の最上位のデータ組織。
コレクション: MongoDB はドキュメントをコレクションに保存します。 関係データベースのテーブルに類似しています。
ドキュメント: string 、数値、日付などのリテラル データ、およびその他の埋め込みドキュメントが含まれます。
ドキュメント フィールドのタイプと構造の詳細については、 マニュアルの ドキュメントMongoDB Server ガイドを参照してください。
データベースへのアクセス
MongoClient
インスタンスで辞書形式のアクセスを使用してデータベースにアクセスします。
次の例えではtest_database
という名前のデータベースにアクセスします。
database = client["test_database"]
コレクションにアクセスする
データベースのインスタンスで辞書スタイルのアクセスを使用してコレクションにアクセスします。
次の例では、 test_collection
という名前のコレクションにアクセスします。
database = client["test_database"] collection = database["test_collection"]
Tip
指定されたコレクション名がデータベースにまだ存在しない場合、MongoDB は最初にデータを挿入するときに暗黙的にコレクションを作成します。
コレクションを作成する
MongoDB database にコレクションを明示的に作成するには、 create_collection()
メソッドを使用します。
次の例では、example_collection
というコレクションを作成しています。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
database = client["test_database"] database.create_collection("example_collection")
database = client["test_database"] await database.create_collection("example_collection")
キーワード引数として渡すことで、最大サイズやドキュメント検証ルールなどのコレクションオプションを指定できます。 オプションのパラメーターの完全なリストについては、「 create_collection() APIドキュメント 」を参照してください。
時系列コレクション
時系列コレクションは一定期間にわたる測定値のシーケンスを効率的に保存します。次の例では、ドキュメントの時間フィールドが timestamp
と呼ばれる example_ts_collection
という時系列コレクションを作成します。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
database = client["test_database"] database.create_collection("example_ts_collection", timeseries={"timeField": "timestamp"})
database = client["test_database"] await database.create_collection("example_ts_collection", timeseries={"timeField": "timestamp"})
PyMongoで時系列データを使用する方法の詳細については、「 時系列データガイド 」を参照してください。
上限付きコレクション
指定されたメモリ サイズまたはドキュメント数を超えて増えることのない、Cappedコレクションを作成できます。次の例では、最大サイズが 1000 バイトの example_capped_collection
という名前のCappedコレクションを作成します。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
database = client["test_database"] database.create_collection("example_capped_collection", capped=True, size=1000)
database = client["test_database"] await database.create_collection("example_capped_collection", capped=True, size=1000)
Capped コレクションの詳細については、 MongoDB Serverマニュアルの「 Capped コレクション 」を参照してください。
コレクションの一覧を取得する
list_collections()
メソッドを呼び出すと、データベース内のコレクションのリストをクエリできます。 メソッドは、データベース内のすべてのコレクションとそれに関連するメタデータを含むカーソルを返します。
次の例では、list_collections()
メソッドを呼び出し、カーソルを反復処理して結果を出力します。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
database = client["test_database"] collection_list = database.list_collections() for c in collection_list: print(c)
database = client["test_database"] collection_list = await database.list_collections() for c in collection_list: print(c)
データベース内のコレクションの名前のみをクエリするには、次のようにlist_collection_name()
メソッドを呼び出します。
collection_list = database.list_collection_names() for c in collection_list: print(c)
collection_list = await database.list_collection_names() async for c in collection_list: print(c)
カーソルの反復処理の詳細については、「 カーソルからデータにアクセスする 」を参照してください。
コレクションの削除
データベースからコレクションを削除するには、 drop_collection()
メソッドを使用します。
次の例では、test_collection
コレクションを削除しています。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
collection = database["test_collection"] collection.drop()
collection = database["test_collection"] await collection.drop()
警告
コレクションを削除すると、コレクション内のすべてのデータが削除されます
データベースからコレクションを削除すると、そのコレクション内のすべてのドキュメントとすべてのインデックスが永続的に削除されます。
コレクション内のデータが不要になった場合にのみコレクションを削除します。
型ヒント
アプリケーションでPython3.5 以降を使用している場合は、 PHP で説明されているように、 型のヒント 484をコードに追加できます。型のヒントは、変数、パラメータ、関数の戻り値のデータ型とドキュメントの構造を示します。一部の IDE では、 型ヒント を使用してコードの型エラーをチェックし、コード完了のための適切なオプションを提案できます。
注意
Python 3.7 以前の TypedDiction
TypedDictionクラスは typing
モジュールにあります。このモジュールはPython 3.8 以降でのみ利用可能です。Pythonの以前のバージョンで TypedDict
クラスを使用するには、 mapping_extentionsパッケージをインストールします。
Database
データベース内のすべてのドキュメントが明確に定義されたスキーマと一致する場合は、ドキュメントの構造を表すためにPythonクラスを使用する型のヒントを指定できます。このクラスをDatabase
オブジェクトの型のヒントに含めることで、保存または検索するすべてのドキュメントが必要な構造を持つようになります。これにより、デフォルトのDict[str, Any]
型よりも正確な型チェックとコード完了が提供されます。
まず、データベースのドキュメントを表すクラスを定義します。クラスはTypedDict
クラスから継承し、データベース内のドキュメントと同じフィールドを含む必要があります 。クラスを定義した後、Database
型ヒントのジェネリック型としてその名前を含めます。
次の例では、Movie
クラスを定義し、それを Database
型ヒントのジェネリック型として使用します。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
from typing import TypedDict from pymongo import MongoClient from pymongo.database import Database class Movie(TypedDict): name: str year: int client: MongoClient = MongoClient() database: Database[Movie] = client["test_database"]
from typing import TypedDict from pymongo import AsyncMongoClient from pymongo.asynchronous.database import Database class Movie(TypedDict): name: str year: int client: AsyncMongoClient = AsyncMongoClient() database: Database[Movie] = client["test_database"]
コレクション
Collection
型ヒントにジェネリック型を追加する方法は、Database
型ヒントにジェネリック型を追加するのと同様です。まず、TypedDict
クラスから継承し、コレクション内のドキュメントの構造を表すクラスを定義します。次に、次の例に示すように、Collection
型ヒントのジェネリック型としてクラス名を含めます。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
from typing import TypedDict from pymongo import MongoClient from pymongo.asynchronous.collection import Collection class Movie(TypedDict): name: str year: int client: MongoClient = MongoClient() database = client["test_database"] collection: Collection[Movie] = database["test_collection"]
from typing import TypedDict from pymongo import AsyncMongoClient from pymongo.collection import Collection class Movie(TypedDict): name: str year: int client: AsyncMongoClient = AsyncMongoClient() database = client["test_database"] collection: Collection[Movie] = database["test_collection"]
トラブルシューティング
クライアント タイプの注釈
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]]``
AutoReconnect
エラー
読み込み設定(read preference)でtag-sets
を指定しており、MongoDB が指定されたタグを持つレプリカセット メンバーを見つけられない場合は、このエラーが表示されます。 このエラーを回避するには、タグセット リストの最後に空の辞書( {}
)を含めます。 これにより、一致するタグが見つからない場合は、読み取り参照モードに一致するノードから読み取るように PyMongo に指示します。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。