次の方法で共有


Python を使用して MongoDB データベースを管理する

適用対象: MongoDB

Azure Cosmos DB の MongoDB サーバーは、次のような MongoDB 用の一般的な Python パッケージから入手できます。

  • PyMongo。同期 Python アプリケーションを対象としたもので、この記事でも使用されています。
  • Motor。非同期 Python アプリケーションを目的としたものです。

Note

コード スニペットの例は、Python プロジェクトとして GitHub 上で使用できます。

データベースに名前を付ける

Azure Cosmos DB では、データベースは名前空間に似ています。 データベースを作成すると、データベース名は、データベース リソースと子リソースへのアクセスに使用される URI のセグメントを形成します。

データベースに名前を付ける場合の簡単な規則を次に示します。

作成されると、データベースの URI の形式は次のとおりです。

https://<cosmos-account-name>.documents.azure.com/dbs/<database-name>

データベース インスタンスを取得する

データベースは、コレクションとそのドキュメントを保持しています。 データベースにアクセスするには、MongoClient のディクショナリ スタイルのアクセスか属性スタイルのアクセスを使用します。 詳細については、データベースの取得に関する情報を参照してください。

次のコード スニペットは、クライアント接続を既に作成済みで、これらのコード スニペットの後にクライアント接続を閉じることを前提としています。

サーバーの情報を取得する

サーバーの情報には、MongoClient クラスの server_info メソッドを使用します。 この情報を取得するためにデータベース名を指定する必要はありません。 返される情報は MongoDB に固有であり、Azure Cosmos DB プラットフォーム自体を表してはいません。

MongoClient.list_database_names メソッドを使用してデータベースを一覧表示したり、MongoClient.db.command メソッドを使用してデータベースに MongoDB コマンドを発行したりすることもできます。

# Get server information
for k, v in client.server_info().items():
    print("Key: {} , Value: {}".format(k, v))

# Get server status of admin database
print("Server status {}".format(client.admin.command("serverStatus")))

# List databases
databases = client.list_database_names()
print("Databases: {}".format(databases))

上記のコード スニペットからは、次の例のようなコンソール出力が表示されます。

Key: version , Value: 3.6.0
Key: versionArray , Value: [3, 6, 0, 0]
Key: bits , Value: 64
Key: maxBsonObjectSize , Value: 16777216
Key: ok , Value: 1.0
Server status {'ok': 1.0}
Databases: ['adventureworks']

データベースは存在するか

存在しないデータベースにアクセスしようとすると、Python 用 PyMongo ドライバーによってデータベースが作成されます。 ただし、格納データの管理は、Azure Cosmos DB の MongoDB 用 API から MongoDB の拡張コマンドを使用して行うことをお勧めします。 データベースが存在しなかった場合に新たに作成するには、次のコード スニペットに示したようにデータベース作成拡張コマンドを使用します。

使用するデータベースが存在するかどうかを事前に調べるには、list_database_names メソッドを使用して、現在のデータベースの一覧を取得します。

# Get list of databases
databases = client.list_database_names()
if not databases:
    print("No databases found")

# Does database exist?
DB_NAME = "adventureworks"
if DB_NAME in databases:
    print("Database exists: {}".format(DB_NAME))
else:
    client[DB_NAME].command(
        {"customAction": "CreateDatabase", "offerThroughput": 400}
    )
    print("Created db '{}' with shared throughput.\n".format(DB_NAME))

上記のコード スニペットからは、次の例のようなコンソール出力が表示されます。

Database exists: adventureworks

データベース、コレクション、ドキュメント数のリストを取得する

MongoDB サーバーをプログラムで管理するときは、サーバー上にどのようなデータベースとコレクションがあり、各コレクション内にドキュメントがいくつあるかを把握すると便利です。 詳細については、次を参照してください。

# Get list of databases
databases = client.list_database_names()

# Loop through databases
for db in databases:
    print("Database: {}".format(db))

    # Get list of collections
    collections = client[db].list_collection_names()

    # Loop through collections
    for col in collections:
        print("\tCollection: {}".format(col))

        # Get document count
        doc_count = client[db][col].count_documents({})
        print("\tDocument count: {}".format(doc_count))

上記のコード スニペットからは、次の例のようなコンソール出力が表示されます。

Database: adventureworks
        Collection: products_new
        Document count: 1
        Collection: products
        Document count: 3
Database: testdb
        Collection: mycoll
        Document count: 1

データベース オブジェクトのインスタンスを取得する

存在しないデータベースにアクセスしようとすると、Python 用 PyMongo ドライバーによってデータベースが作成されます。 ただし、格納データの管理は、Azure Cosmos DB の MongoDB 用 API から MongoDB の拡張コマンドを使用して行うことをお勧めします。 実際のパターンについては、前出のセクション「データベースは存在するか」を参照してください。

PyMongo でのデータベースへのアクセスには、MongoClient インスタンスの属性スタイルのアクセスを使用します。 データベース インスタンスの取得後、以下の例のようにデータベース レベルの操作を行うことができます。

collections = client[db].list_collection_names()

PyMongo ドライバーを使用したデータベース操作の概要については、「データベース レベルの操作」を参照してください。

データベースの削除

サーバーからデータベースを削除するには、MongoClient の drop_database メソッドを使用します。

DB_NAME = input("Enter database name to drop: ")
if DB_NAME in client.list_database_names():
    print("Dropping database: {}".format(DB_NAME))
    client.drop_database(DB_NAME)
else:
    print("Didn't find database: {}".format(DB_NAME))

上記のコード スニペットからは、次の例のようなコンソール出力が表示されます。

Enter database name to drop: adventureworks
Dropping database: adventureworks

関連項目