🐍
Python + Motor で操作する MongoDB チュートリアル (WIP)
基本用語説明
用語 | 説明 |
---|---|
データベース (Database) | MongoDB内のデータのコンテナであり、複数のコレクションを含むことができます。 |
コレクション (Collection) | ドキュメントのグループであり、MongoDB内のデータの構造を定義します。テーブルに相当します。 |
ドキュメント (Document) | MongoDB内のデータの基本単位であり、キーと値のペアの集合です。JSON形式のデータです。レコードに相当します。 |
フィールド (Field) | ドキュメント内の個々のデータ項目であり、キーと値のペアです。列に相当します。 |
ドキュメントID (Document ID) | MongoDB内のドキュメントを一意に識別するための特別なフィールドです。自動的に生成される _id フィールドがデフォルトで使用されます。 |
クエリ (Query) | データベースからドキュメントを検索するために使用される条件です。フィルタリングやソートなどの操作を指定します。 |
インデックス (Index) | ドキュメントの検索パフォーマンスを向上させるために使用されるデータ構造です。特定のフィールドに対して作成されます。 |
プライマリキー (Primary Key) | MongoDB内のドキュメントを一意に識別するための特定のフィールドまたはフィールドの組み合わせです。 |
mongodb に接続し、コレクションを取得する
import motor.motor_asyncio
# MongoDBへの接続
client = motor.motor_asyncio.AsyncIOMotorClient('mongodb://localhost:27017')
db = client['your_database'] # データベース名
collection = db['your_collection'] # コレクション名
(補足)非同期関数を実行する
import asyncio
# 非同期でコードを実行するためのイベントループを作成
loop = asyncio.get_event_loop()
# コードを実行
loop.run_until_complete(async_function(arg))
特定のコレクション内のドキュメント数を数える
from motor.motor_asyncio import AsyncIOMotorCollection
async def count_documents(collection: AsyncIOMotorCollection) -> int:
count = await collection.count_documents({})
return count
特定のコレクション内のフィールドの件数を数える
from motor.motor_asyncio import AsyncIOMotorCollection
async def count_fields(collection: AsyncIOMotorCollection) -> int:
# フィールドの件数を数える
cursor = collection.aggregate([
{"$project": {"_id": 0, "field_names": {"$objectToArray": "$$ROOT"}}},
{"$unwind": "$field_names"},
{"$group": {"_id": None, "count": {"$sum": 1}}},
])
async for doc in cursor:
count = doc['count']
return count
return 0
-
$project
ステージ:$$ROOT
を$objectToArrayで変換し、フィールド名をキーとした配列に変換します。 -
$unwind
ステージ: 配列を展開し、各フィールドを個別のドキュメントに分割します。 -
$group
ステージ: ドキュメントをグループ化し、フィールドの件数を合計します。
特定のコレクション内の特定のキーのフィールド件数を数える
from motor.motor_asyncio import AsyncIOMotorCollection
async def count_field_occurrences(collection: AsyncIOMotorCollection, key: str) -> int:
pipeline = [
{"$group": {"_id": f"${key}", "count": {"$sum": 1}}},
{"$group": {"_id": None, "totalCount": {"$sum": "$count"}}}
]
results = await collection.aggregate(pipeline).to_list(1)
if results:
count = results[0]["totalCount"]
else:
count = 0
return count
特定のコレクション内の特定のキーのユニークフィールド件数を数える
from motor.motor_asyncio import AsyncIOMotorCollection
async def count_unique_field_occurrences(collection: AsyncIOMotorCollection, key: str) -> int:
pipeline = [
{"$group": {"_id": f"${key}"}},
{"$group": {"_id": None, "count": {"$sum": 1}}}
]
result = await collection.aggregate(pipeline).to_list(1)
if result:
count = result[0]['count']
else:
count = 0
return count
Discussion