著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。

序章

MongoDB は、JSONのようなドキュメントを使用してデータを保存する汎用のドキュメント指向のNoSQLデータベースプログラムです。 リレーショナルデータベースで使用される表形式のリレーションとは異なり、JSONのようなドキュメントでは、シンプルさを維持しながら柔軟で動的なスキーマを使用できます。 一般に、NoSQLデータベースは水平方向に拡張できるため、ビッグデータやリアルタイムアプリケーションに適しています。

データベースドライバまたはコネクタは、アプリケーションをデータベースプログラムに接続するプログラムです。 Pythonを使用してMongoDBでCRUD操作を実行するには、通信チャネルを確立するためのドライバーが必要です。 PyMongoは、PythonからMongoDBを操作するための推奨ドライバーです。

このガイドでは、Ubuntu 20.04にローカルにインストールされたMongoDBサーバーでデータを作成、取得、更新、および削除するPythonスクリプトを記述します。 最後に、MongoDBとPythonアプリケーション間でデータがどのように移動するかについての基礎となる概念を理解するための関連スキルを習得します。

前提条件

このガイドを進める前に、次のものが必要です。

  • Ubuntu 20.04初期サーバーセットアップガイドに従ってセットアップされた、少なくとも1GBのRAMを備えた1つのUbuntu 20.04サーバー(sudo非rootユーザーとファイアウォールを含む)。

  • このクイックスタートガイドを使用してUbuntu20.04に設定された環境でのPython3のインストール。

  • Ubuntu20.04ガイドにMongoDBをインストールする方法を使用したUbuntu20.04と互換性のある最新のMongoDBサーバーのインストール。

  • 不正アクセスを防ぐためのUbuntu20.04でのMongoDBのセキュリティ構成。

ステップ1—PyMongoを設定する

このステップでは、PythonからMongoDBの推奨ドライバーであるPyMongoをインストールします。 PyMongoは、MongoDBを操作するためのツールのコレクションとして、Pythonにネイティブな構文とインターフェイスを使用してデータベースリクエストを容易にします。

PyMongoを有効にするには、Ubuntuターミナルを開き、 Python PackageIndexからインストールします。 Pythonプロジェクトを分離するために、仮想環境内にPyMongoをインストールすることをお勧めします。 前提条件で仮想環境を設定する方法を見逃した場合は、このガイドを参照してください。

  1. pip3 install pymongo

pip3は、Python用の人気のあるpipパッケージインストーラーのPython3バージョンを指します。 Python 3仮想環境内では、pip3の代わりにコマンドpipを使用できることに注意してください。

次に、以下のコマンドでPythonインタープリターを開きます。 インタプリタは、Pythonコードをインタラクティブに実行できるUnixシェルのように動作する仮想マシンです。

  1. python3

以下のような出力が得られたら、インタープリターを使用しています。

Output
Python 3.8.5 (default, Jan 27 2021, 15:41:15) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information.

出力が成功したら、Pythonインタープリターにpymongoをインポートします。

  1. import pymongo

importステートメントを使用して、端末のpymongoモジュールとそのコードにアクセスできます。 importステートメントは、例外を発生させることなく実行されます。

次の行で、getpassをインポートします。

  1. from getpass import getpass

getpassは、パスワード入力を管理するためのモジュールです。 このモジュールは、入力を表示せずにパスワードの入力を求め、パスワードがプレーンテキストとして表示されないようにするセキュリティメカニズムを追加します。

ここで、MongoClientと接続して、データベースのMongoDBインスタンスを有効にします。 変数clientを宣言して、hostusernamepassword、およびauthMechanismを引数としてMongoClientインスタンスを保持します。

  1. client = pymongo.MongoClient('localhost', username='username', password=getpass('Password: '), authMechanism='SCRAM-SHA-256')

承認を有効にしてMongoDBに接続するには、MongoClientに次の4つの引数が必要です。

  • host-MongoDBがインストールされているサーバーのホスト名。 このコンテキストではMongoはローカルであるため、localhostを使用します。
  • usernameおよびpassword-MongoDBで認証を有効にした後に作成された認証クレデンシャル。
  • authMechanism SCRAM-SHA-256は、MongoDB4.0以降での認証用に構成されたクラスターでサポートされるデフォルトの認証メカニズムです。

クライアント接続を確立すると、MongoDBインスタンスと対話できるようになります。

ステップ2—データベースとコレクションのテスト

このステップでは、MongoDBに適用されるコレクションやドキュメントなどのNoSQLの概念を理解します。

MongoDBは、MongoClientインスタンス内の複数の独立したデータベースの管理をサポートしています。 MongoClientインスタンスの属性スタイルを使用して、データベースにアクセスまたは作成できます。 変数dbを宣言し、新しいデータベースをclientの属性として割り当てます。

  1. db = client.workplace

このコンテキストでは、workplaceデータベースは、従業員の名前や役割など、追加する従業員のレコードを追跡します。

次に、コレクションを作成します。 リレーショナルデータベースのテーブルと同様に、コレクションはドキュメントのグループをMongoDBに格納します。 Pythonインタープリターで、employeesコレクションをdbの属性として作成し、同じ名前の変数に割り当てます。

  1. employees = db.employees

employeesコレクションをdbの属性として作成し、同じ名前の変数に割り当てます。

注: MongoDBでは、データベースとコレクションが遅延して作成されます。 これは、最初のドキュメントが作成されるまで、上記のコードは実際には実行されないことを意味します。

コレクションを確認したので、MongoDBがドキュメントを表す方法、つまりデータを表すための基本構造を見てみましょう。

ステップ3—CRUD操作の実行

このステップでは、CRUD操作を実行してMongoDBのデータを操作します。 作成、取得、更新、および削除(CRUD)は、永続ストレージを作成するために実行できるコンピュータープログラミングの4つの基本操作です。

PythonでデータをJSONのようなドキュメントとして表すために、辞書が使用されます。 nameおよびrole属性を使用してサンプル従業員レコードを作成します。

  1. employee = {
  2. "name": "Sammy",
  3. "role": "Developer"
  4. }

ご覧のとおり、 Python辞書は、構文がJSONドキュメントと非常に似ています。 PyMongoは、スケーラブルなデータストレージのためにPython辞書をJSONドキュメントに変換します。

この時点で、従業員レコードをemployeesコレクションに挿入します。

  1. employees.insert_one(employee)

employeesコレクションでinsert_one()メソッドを呼び出して、挿入する前に作成した従業員レコードを提供します。 挿入が成功すると、次のような成功した出力が返されます。

Output
<pymongo.results.InsertOneResult object at 0x7f8c5e3ed1c0>

ここで、従業員レコードとコレクションが正常に挿入されたことを確認します。 作成したばかりの従業員を見つけるためにクエリを実行します。

  1. employees.find_one({"name": "Sammy"})

名前クエリを使用してemployeesコレクションで find_one()メソッドを呼び出すと、一致する単一のドキュメントが返されます。 この方法は、ドキュメントが1つしかない場合、または最初の一致に関心がある場合に役立ちます。

出力は次のようになります。

Output
{'_id': ObjectId('606ae5b2358ddf640da46894'), 'name': 'Sammy', 'role': 'Developer'}

注:ドキュメントが挿入されると、_idキーがまだ含まれていない場合、一意のキー_idがドキュメントに自動的に追加されます。

既存のドキュメントを変更する必要が生じた場合は、update_one()メソッドを使用してください。 update_one()メソッドには、queryupdateの2つの引数が必要です。

  • query {"name": "Sammy"}-PyMongoは、このクエリパラメータを使用して、一致する要素を持つドキュメントを検索します。
  • update { "$set": {"role": "Technical Writer"} }-updateパラメーターは、フィールドの値を指定された値に置き換える$set演算子を実装します。

employeesコレクションでupdate_one()メソッドを呼び出します。

  1. employees.update_one({"name": "Sammy"}, { "$set": {"role": "Technical Writer"} })

更新が成功すると、次のような出力が返されます。

Output
<pymongo.results.UpdateResult object at 0x7f8c5e3eb940>

1つのドキュメントを削除するには、delete_one()メソッドを使用します。 delete_one()には、削除するドキュメントを指定するクエリパラメータが必要です。 クエリパラメータとしてSammyという名前で、employeesコレクションの属性としてdelete_one()メソッドを実行します。

  1. employees.delete_one({"name": "Sammy"})

これにより、employeesコレクションにある唯一のエントリが削除されます。

Output
<pymongo.results.DeleteResult object at 0x7f8c5e3c8280>

find_one()メソッドを再度使用すると、コンソールに何も出力されないため、Sammyの従業員レコードが正常に削除されたことがわかります。

  1. employees.find_one({"name": "Sammy"})

insert_one()find_one()update_one()、およびdelete_one()は、PyMongoを使用してMongoDBでCRUD操作を実行するための優れた方法です。

結論

このガイドでは、データベースドライバーであるPyMongoをセットアップして構成し、PythonコードをMongoDBに接続する方法と、ドキュメントを作成、取得、更新、削除する方法について説明しました。 このガイドは入門的な概念に焦点を当てていますが、PyMongoはMongoDBを操作するためのより強力で柔軟な