何年もの間、MongoDBは、大規模なアプリケーションを構築する個人と企業の両方にとって頼りになるNoSQLデータベースでした。オープンソースで、簡単にスケーラブルで、高可用性を提供します。また、非常に複雑なクエリときめ細かい同時実行制御もサポートしています。
ただし、データベースのインストール、長期間にわたって最適なパフォーマンスを維持するためのデータベースの調整、データベースの保護などの必要なタスクには、多くの熟練した専用の作業が必要になる傾向があります。
幸い、もっと簡単な代替手段があります。それは、データベースの完全に管理されたクラウドバージョンであるMongoDBAtlasです。
MongoDB Atlasを使用すると、選択した主要なクラウドプロバイダー上にMongoDBクラスターを作成し、そのクラスターの使用を数分で開始できます。 Atlasのブラウザベースのユーザーインターフェイスを使用して、クラスターを直感的に構成し、そのパフォーマンスを監視することもできます。
このチュートリアルでは、MongoDB Atlasの無料利用枠クラスターを作成し、Pythonアプリケーションで使用する方法を紹介します。
前提条件
続行する前に、コンピュータに次のものがインストールおよび構成されていることを確認してください。
- Python3.4以降
- pip18.0以降
1。クラスターの作成
MongoDBのクラウドサービスを使用できるようにするには、MongoDBAtlasアカウントが必要です。作成するには、ホームページに移動して、無料で開始を押します。 ボタン。
短いサインアップフォームに記入すると、クラスター作成ウィザードにリダイレクトされます。最初のセクションでは、ご希望のクラウドプロバイダーとリージョンを選択する必要があります。
ネットワークの遅延を最小限に抑えるには、理想的には、コンピューターに最も近い地域を選択します。ただし、現時点では無料利用枠クラスターを作成しているため、選択する地域が無料利用枠を利用できる地域であることを確認してください。さらに、開発環境としてGoogle CloudVMまたはAmazonEC2インスタンスを使用している場合は、最初に対応するクラウドプロバイダーを選択してください。
クラスター層 セクションで、 M0を選択します 無料利用枠クラスターを作成するオプション。 512 MBのストレージスペース、ストレージエンジンとしてWiredTigerを備えた最新バージョンのMongoDB、3つのノードのレプリカセット、および1週間あたり10GBの十分な帯域幅を提供します。
最後に、クラスターに意味のある名前を付けて、クラスターの作成を押します。 ボタン。
MongoDB Atlasは、クラスターのセットアップに約5分かかります。
2。クラスターの構成
クラスタの使用を開始する前に、セキュリティ関連の詳細をいくつか提供する必要があるため、セキュリティに切り替えてください タブ。
まず、MongoDBユーザーで セクションでは、新しいユーザーの追加を押して、自分で新しいユーザーを作成する必要があります ボタン。ポップアップ表示されるダイアログで、目的のユーザー名とパスワードを入力し、任意のデータベースの読み取りと書き込みを選択します。 権限を取得し、ユーザーの追加を押します ボタン。
次に、IPホワイトリストで セクションでは、クラスターにアクセスするIPアドレスのリストを提供する必要があります。今のところ、コンピュータの現在のIPアドレスを提供するだけで十分です。
IPアドレスの追加を押します ボタンをクリックして、新しいIPアドレスエントリを作成します。ポップアップ表示されるダイアログで、現在のIPアドレスを追加を押します。 ホワイトリストエントリを自動入力するボタン 分野。さらに、静的IPアドレスがない場合は、一時的なホワイトリストとして保存をチェックして、一時的なエントリとしてマークすることをお勧めします。 オプション。最後に、確認を押します エントリを追加します。
3。接続文字列の取得
アプリケーションからクラスターに接続するには、有効な接続文字列が必要です。入手するには、概要にアクセスしてください タブを押して接続を押します ボタン。
開いたダイアログで、アプリケーションの接続を選択します オプションを選択し、ドライバ3.6以降を使用していますを押します。 ボタン。これで、接続文字列が表示されるはずです。実際のパスワードは含まれていないため、手動で入力する必要があります。その後、後で使用できるように文字列をメモしておきます。
4。 Pythonドライバーのインストール
プログラムでMongoDBAtlasクラスターと対話できるようにするには、コンピューターにMongoDBドライバーがインストールされている必要があります。 Pythonプログラミング言語の場合、PyMongoは現在入手可能な最も人気のあるドライバーです。コンピューターにインストールするための推奨される方法は、pipを使用することです。 以下に示すモジュール:
python3 -m pip install pymongo --user
MongoDBAtlas接続文字列がmongodb+srv://であることに気付いたかもしれません。 URI。ドライバがDNSSRVレコードを処理できるようにするには、dnspythonもインストールする必要があります モジュール。方法は次のとおりです。
python3 -m pip install dnspython --user
5。クラスターへの接続
これで、任意のPythonアプリケーションからMongoDBクラスターを使用できます。私と一緒にフォローするには、新しいPythonスクリプトを作成し、任意のコードエディタを使用して開きます。
スクリプト内でクラスターとやり取りできるようにするには、MongoClientのインスタンスが必要です。 クラス。コンストラクターへの唯一の引数として、接続文字列を渡します。
import pymongo
my_client = pymongo.MongoClient(
'mongodb+srv://alice:myPassword@mylittlecluster-qsart.gcp.mongodb.net/test?retryWrites=true'
)
上記のコンストラクターはすぐに戻り、エラーは発生しません。したがって、接続が正常に確立されたかどうかを確認するには、クラスターで操作を実行することをお勧めします。 server_info()の呼び出し MongoDBインスタンスに関するさまざまな詳細を取得するメソッドで十分です。
接続文字列にエラーがない場合は、server_info()を呼び出します。 メソッドは成功します。ただし、指定したユーザー名またはパスワードが正しくない場合は、OperationFailureが発生します。 エラー。次のコードは、それをキャッチする方法を示しています。
try:
print("MongoDB version is %s" %
my_client.server_info()['version'])
except pymongo.errors.OperationFailure as error:
print(error)
quit(1) これで、先に進んでスクリプトを実行してみることができます。
6。ドキュメントの挿入
MongoDB AtlasのWebインターフェイスから取得するデフォルトの接続文字列には、testという名前のデータベースが記載されています。 。同じデータベースを使い続けましょう。これを参照する方法は次のとおりです。
my_database = my_client.test
MongoDBデータベースは、1つ以上のコレクションで構成されています。これらのコレクションは、BSONドキュメント(バイナリJSONの略)のグループにすぎません。 MongoDB Atlasの無料利用枠クラスターには、最大500のコレクションを含めることができます。
現実的な例として、foodsという名前の新しいコレクションを作成しましょう。 。 PyMongoを使用すると、そのためにメソッドを明示的に呼び出す必要はありません。すでに存在するかのように簡単に参照できます。
my_collection = my_database.foods
上記のコードはfoodsを作成しないことに注意してください。 すぐにコレクション。ドキュメントを追加した後にのみ作成されます。それでは、食品に関する栄養データを含む新しいドキュメントを作成して追加しましょう。
insert_one()を使用する メソッドは、ドキュメントをコレクションに追加する最も簡単な方法です。ドキュメントの内容を指定するには、Pythonディクショナリをメソッドに渡します。次のサンプルコードは、その方法を示しています。
my_collection.insert_one({
"_id": 1,
"name": "pizza",
"calories": 266,
"fats": {
"saturated": 4.5,
"trans": 0.2
},
"protein": 11
})
一度に1つずつドキュメントを追加すると、非効率になる可能性があります。 insert_many()を使用 メソッドでは、一度に複数のドキュメントをコレクションに追加できます。入力として辞書の配列を想定しています。次のコードは、コレクションにさらに2つのドキュメントを追加します。
my_collection.insert_many([
{
"_id": 2,
"name": "hamburger",
"calories": 295, "protein": 17,
"fats": { "saturated": 5.0, "trans": 0.8 },
},
{
"_id": 3,
"name": "taco",
"calories": 226, "protein": 9,
"fats": { "saturated": 4.4, "trans": 0.5 },
}
])
_id 上記のドキュメントに表示されているフィールドは、MongoDBによって主キーとして使用されているフィールドです。そのため、不変であり、すべてのMongoDBドキュメントに存在する必要があります。ドキュメントの作成時に含めるのを忘れた場合、PyMongoが自動的に追加し、自動生成された一意の値を割り当てます。
7。クエリの実行
コレクションにいくつかのドキュメントを追加したら、find()を呼び出すことでコレクションに対してクエリを実行できます。 Cursorを返すメソッド。 繰り返すことができるオブジェクト。引数を渡さない場合は、find コレクション内のすべてのドキュメントを返します。
次のコードは、コレクションに含まれるすべての食品の名前を印刷する方法を示しています。
my_cursor = my_collection.find()
for item in my_cursor:
print(item["name"])
# Output is:
# pizza
# hamburger
# taco
find()が必要な場合 特定の基準に一致するドキュメントのみを返すメソッドでは、Pythonディクショナリを渡す必要があります。たとえば、nameのドキュメントを検索する場合 フィールドが「ピザ」に設定されている場合、次のコードを使用できます:
my_cursor = my_collection.find({
"name": "pizza"
})
より複雑なクエリの場合は、find()に渡す辞書でMongoDBの直感的に名前が付けられたクエリ演算子を使用できます。 方法。たとえば、次のコードは、$ltの使用方法を示しています。 caloriesのドキュメントを検索する演算子 フィールドが280未満の値に設定されている:
my_cursor = my_collection.find({
"calories": { "$lt": 280 }
})
for item in my_cursor:
print("Name: %s, Calories: %d" %
(item["name"], item["calories"]))
# Output is:
# Name: pizza, Calories: 266
# Name: taco, Calories: 226
ドット表記を使用すると、クエリでネストされたフィールドを使用することもできます。次のコードは、transのドキュメントを検索する方法を示しています。 fats内にあるフィールド フィールドは、0.5以上の値に設定されます:
my_cursor = my_collection.find({
"fats.trans": { "$gte": 0.5 }
})
for item in my_cursor:
print("Name: %s, Trans fats: %.2f" %
(item["name"], item["fats"]["trans"]))
# Output is:
# Name: hamburger, Trans fats: 0.80
# Name: taco, Trans fats: 0.50 8。ドキュメントの更新と削除
insert_one()と非常によく似ています およびinsert_many() メソッドはupdate_one()です およびupdate_many() すでにコレクション内にあるドキュメントのコンテンツを変更するために使用できるメソッド。新しいデータに加えて、両方の更新方法では、変更が必要なドキュメントに焦点を当てるクエリが必要です。
更新メソッドでは、さまざまな更新演算子を使用できます。最も一般的に使用されるのは$setです。 、これにより、新しいフィールドを追加したり、既存のフィールドの値を更新したりできます。次のコードは、fiberという名前の2つの新しいフィールドを追加する方法を示しています。 およびsugar nameのドキュメントへ フィールドは「taco」に設定されています:
my_collection.update_one(
{ "name": "taco" }, # query
{
"$set": { # new data
"fiber": 3.95,
"sugar": 0.9
}
}
)
update_one()に渡すクエリの場合 メソッドは複数のドキュメントを返し、最初のドキュメントのみが更新されます。 update_many() メソッドにはこの制限はありません。
最後に、delete_one()を使用します およびdelete_many() メソッドでは、コレクション内のドキュメントを削除できます。どちらの方法でも、削除する必要のあるドキュメントを判別するためのクエリが必要です。 caloriesのすべてのドキュメントを削除する方法は次のとおりです。 フィールドが300未満の値に設定されている:
my_collection.delete_many({
"calories": {
"$lt": 300
}
})
# Deletes all the three documents