Python を使用して MongoDB データベースにローカル接続する

Tahseen Tauseef 2023年10月10日
  1. MongoDB にデータを保存する
  2. Python を使用して MongoDB データベースにローカル接続する
  3. Python でコレクションを作成する
  4. Python でドキュメントを挿入する
  5. Python でのクエリ
  6. Python と MongoDB のインデックス
Python を使用して MongoDB データベースにローカル接続する

Python はデータ サイエンスで最も普及しているプログラミング言語であり、柔軟で動的なスキーマを備えた MongoDB は、最新の Web アプリケーション、JSON API、およびデータ プロセッサを作成するための優れた組み合わせです。

MongoDB には、ネイティブの Python ドライバーと、MongoDB と Python がシームレスに連携して機能することを約束するエンジニアのチームも含まれています。

Python は、一般的なデータ操作と処理操作を幅広くサポートしています。 たとえば、Python のネイティブ ディクショナリおよびリスト データ構造は、JSON ドキュメントを処理する際に JavaScript に次ぐものであり、BSON を操作するのに理想的です。

公式の Python MongoDB ドライバー ライブラリである PyMongo も同様にシンプルで、データベース、コレクション、およびドキュメントにアクセスするための直感的な API を提供します。

PyMongo を使用して MongoDB からフェッチされたオブジェクトは、辞書およびリストと互換性があり、簡単な操作、反復、および印刷が可能です。

MongoDB にデータを保存する

MongoDB はデータを JSON のようなドキュメントに格納します。

# Mongodb document (JSON-style)
document_1 = {
    "_id": "BF00001CFOOD",
    "item_name": "Bread",
    "quantity": 2,
    "ingredients": "all-purpose flour",
}

Python 辞書は次のようになります。

# python dictionary
dict_1 = {
    "item_name": "blender",
    "max_discount": "10%",
    "batch_number": "RR450020FRG",
    "price": 440,
}

Python の前提条件とインストール

マシンに Python をダウンロードしてインストールします。 コマンド ライン ウィンドウにpythonと入力して、インストールが正しいかどうかを確認します。

以下を取得する必要があります。

Python 3.9.1 (tags/v3.9.1:9cf6752, Feb  5 2021, 10:34:40) [MSC v.1927 64 bit (AMD64)] on win32
>>>

Python を初めて使用する場合は、このレッスンの Python MongoDB の例に従うことができます。

Python を使用して MongoDB データベースにローカル接続する

PyMongo は、Python で MongoDB を操作するための一連のライブラリを提供します。 PyMongo を起動して実行するには、コマンド プロンプトを開き、次のように入力します。

python -m pip install pymongo

この Python MongoDB チュートリアルでは、MongoDB SRV URI を使用します。 dnspython をインストールしましょう:

python -m pip install dnspython

これで、import ステートメントを使用して、コード内で PyMongo を Python MongoDB ライブラリとして使用できるようになりました。 ただし、最初に Python で MongoDB データベースを作成します。

したがって、Python を接続するための最初のステップは、MongoDB クラスターのセットアップです。

次に、任意のサブディレクトリにある pymongo test insert.py ファイルに PyMongo コードを記述します。 Textpad/Notepad などの単純なテキスト エディタで十分です。

次の行を MongoDB クライアントに追加します。

def get_database():
    from pymongo import MongoClient
    import pymongo

    # Provide the mongodb url to connect python to mongodb using pymongo
    CONNECTION_STRING = (
        "mongodb+srv://<username>:<password>@<cluster-name>.mongodb.net/myFirstDatabase"
    )

    # Create a connection using MongoClient. You can import MongoClient or use pymongo.MongoClient
    from pymongo import MongoClient

    client = MongoClient(CONNECTION_STRING)

    # Create the database for your example
    return client["user_shopping_list"]

    # This is added so that files can reuse the function get_database()
    if __name__ == "__main__":
        # Get database
        dbname = get_database()

MongoDB データベース接続を取得するには、CONNECTION_STRING を使用して Mongo クライアントを作成します。 最初にクラスター名、ユーザー名、およびパスワードを変更します。

この Python MongoDB レッスンでは、買い物リストを作成し、いくつかの製品を追加します。 このために user shopping list というデータベースを作成しましたね。

一方、MongoDB は、コレクションとドキュメントをデータベースに追加するまで、データベースを確立しません。 では、次はコレクションを作ってみましょう。

Python でコレクションを作成する

コレクションを作成するには、コレクション名をデータベースに渡します。 コードを .py ファイルにコピーするときは、適切なインデントを確認してください。

collection_name = dbname["user_1_items"]

これにより、user_shopping_list データベースに user_1_items という名前のコレクションが作成されます。

Python でドキュメントを挿入する

一度に多くのドキュメントを挿入するには、PyMongo insert_many() メソッドを使用します。

item1 = {
    "_id": "U1IT00001",
    "item_name": "Blender",
    "max_discount": "10%",
    "batch_number": "RR450020FRG",
    "price": 440,
    "category": "kitchen appliance",
}

item2 = {
    "_id": "U1IT00002",
    "item_name": "Egg",
    "category": "food",
    "quantity": 12,
    "price": 50,
    "item_description": "brown country eggs",
}
collection_name.insert_many([item1, item2])

_id フィールドに言及せずに 3 番目のドキュメントを挿入します。 今回は、日付データ型フィールドを含めます。

Python dateutil モジュールを使用して、PyMongo に日付を追加します。 ISODate は Mongo シェル関数であるため、Python では機能しません。

python -m pip install python-dateutil は、パッケージをインストールするコマンドです。 次に、pymongo test.py に以下を追加します。

from dateutil import parser

expiry_date = "2021-07-13T00:00:00.000Z"
expiry = parser.parse(expiry_date)
item3 = {
    "item_name": "Bread",
    "quantity": 2,
    "ingredients": "all-purpose flour",
    "expiry_date": expiry,
}
collection_name.insert_one(item3)

insert one() メソッドは、単一のドキュメントを挿入するために使用されました。

まず、コマンド ラインを使用して、pymongo test insert.py を保存した場所に移動します。 次に、Python pymongo test insert.py コマンドを使用してファイルを実行します。

Python でのクエリ

find() を使用して、すべてのドキュメントをまとめて表示できます。 そのために、別のファイル pymongo_test_query.py を作成します。

# Get the database using the method you defined in the pymongo_test_insert file
from pymongo_test_insert import get_database

dbname = get_database()

# Create a new collection
collection_name = dbname["user_1_items"]

item_details = collection_name.find()
for item in item_details:
    # This does not give a readable output
    print(item)

コマンド ラインを使用して、pymongo test query.py を保存したフォルダーに移動します。 python pymongo test query.py コマンドを使用して、プログラムを実行できます。

データは表示可能ですが、形式が理想的ではありません。 印刷するアイテム名とそのカテゴリは次のとおりです。

print(item["item_name"], item["category"])

MongoDB はすべてのデータを受信しますが、3 番目のドキュメントで Python KeyError が発生します。 pandas を使用して、Python DataFrame で欠落しているデータの問題を処理します。

DataFrame は、データ処理で使用される 2 次元のデータ構造です。 たとえば、Pymongo の discover() メソッドは、わずか 1 行のコードでデータ フレームに変換できる辞書オブジェクトを返します。

pandas ライブラリを次のようにインストールします。

python -m pip install pandas

for ループを次のコードに置き換えて、KeyError を 1 ステップで処理します。

from pandas import DataFrame

# convert the dictionary objects to a data frame
items_dfs = DataFrame(item_details)
print(items_dfs)

print(item['item name'], item['category']) をコメントアウトすることを忘れないでください。 欠損値については、NaNNaT を使用して誤りを置き換えます。

Python と MongoDB のインデックス

実際のデータベース内のドキュメントとコレクションの数は増え続けています。 大規模なコレクションでは、特定の論文 (たとえば、成分として 万能小麦粉 を含むレコード) を検索するには、長い時間がかかる場合があります。

インデックスを使用すると、データベース検索が高速化、効率化され、コストが削減されます。たとえば、並べ替え、カウント、一致などです。

コレクション レベルで、MongoDB はインデックスを定義します。 コレクションに新しいドキュメントを追加して、インデックスをより論理的にします。

insert many() メソッドを使用すると、複数のドキュメントを同時に挿入できます。