🐍

Python + Motor で操作する MongoDB チュートリアル (WIP)

2023/07/18に公開

基本用語説明

用語 説明
データベース (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