Overview
このガイドでは、PyMongo を使用してクエリを指定する方法を学習できます。
クエリフィルターを作成することで、クエリが返すドキュメントのセットを絞り込むことができます。 クエリフィルター は、MongoDB が読み取りまたは書込み (write) 操作でドキュメントを照合するために使用する検索条件を指定する 式 です。 クエリフィルターでは、クエリに完全に一致するドキュメントを検索するようにドライバーに指示することも、より複雑な一致条件をExpressするためにクエリフィルターを作成することもできます。
サンプル データ
このガイドの例では、次のドキュメントを含むfruitsというコレクションに対して操作を実行します。
{ "_id": 1, "name": "apples", "qty": 5, "rating": 3, "color": "red", "type": ["fuji", "honeycrisp"] },{ "_id": 2, "name": "bananas", "qty": 7, "rating": 4, "color": "yellow", "type": ["cavendish"] },{ "_id": 3, "name": "oranges", "qty": 6, "rating": 2, "type": ["naval", "mandarin"] },{ "_id": 4, "name": "pineapple", "qty": 3, "rating": 5, "color": "yellow" },次のコード例は、データベースとコレクションを作成し、サンプルドキュメントをコレクションに挿入する方法を示しています。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
from pymongo import MongoClient
uri = "<connection string URI>"client = MongoClient(uri)
try: database = client["sample_fruit"] collection = database["fruits"]
collection.insert_many([ { "_id": 1, "name": "apples", "qty": 5, "rating": 3, "color": "red", "type": ["fuji", "honeycrisp"] }, { "_id": 2, "name": "bananas", "qty": 7, "rating": 4, "color": "yellow", "type": ["cavendish"] }, { "_id": 3, "name": "oranges", "qty": 6, "rating": 2, "type": ["naval", "mandarin"] }, { "_id": 4, "name": "pineapple", "qty": 3, "rating": 5, "color": "yellow" }, ])
client.close()
except Exception as e: raise Exception("Error inserting documents: ", e)from pymongo import AsyncMongoClient
uri = "<connection string URI>"client = AsyncMongoClient(uri)
try: database = client["sample_fruit"] collection = database["fruits"]
await collection.insert_many([ { "_id": 1, "name": "apples", "qty": 5, "rating": 3, "color": "red", "type": ["fuji", "honeycrisp"] }, { "_id": 2, "name": "bananas", "qty": 7, "rating": 4, "color": "yellow", "type": ["cavendish"] }, { "_id": 3, "name": "oranges", "qty": 6, "rating": 2, "type": ["naval", "mandarin"] }, { "_id": 4, "name": "pineapple", "qty": 3, "rating": 5, "color": "yellow" }, ])
await client.close()
except Exception as e: raise Exception("Error inserting documents: ", e)完全一致
リテラル値クエリは、クエリフィルターに完全に一致するドキュメントを返します。
次の例えでは、 find()メソッドのパラメーターとしてクエリフィルターを指定します。 このコードでは、 colorフィールドの値が"yellow"であるすべてのドキュメントが返されます。
results = collection.find({ "color": "yellow" })Tip
すべてのドキュメントの検索
コレクション内のすべてのドキュメントを検索するには、 find()メソッドを呼び出し、そのメソッドに空のクエリフィルターを渡します。 次の例では、 コレクション内のすべてのドキュメントを検索します。
results = collection.find({})比較演算子
比較演算子は、クエリフィルター内の指定された値に対してドキュメント フィールド値を評価します。 以下は、一般的な比較演算子のリストです。
$gt: より大きい$lte: 以下$ne: 等しくない
演算子の完全なリストを表示するには、 マニュアルの「 比較クエリ演算子 MongoDB Server」ガイドを参照してください。
次の例では、クエリフィルター内の 比較演算子をfind()メソッドへのパラメーターとして指定しています。 コードは、 ratingフィールドの値が2より大きいすべてのドキュメントを返します。
results = collection.find({ "rating": { "$gt" : 2 }})
for f in results: print(f) results = collection.find({ "rating": { "$gt" : 2 }})
async for f in results: print(f) 論理演算子
論理演算子は、2 つ以上の式のセットの結果に適用されたロジックを使用してドキュメントを一致させます。 以下は論理演算子のリストです。
$andは、すべての句の条件に一致するすべてのドキュメントを返します。$orは、 1 つの句の条件に一致するすべてのドキュメントを返します$norは、どの句の条件にも一致しないすべてのドキュメントを返します。$notは、式に一致しないすべてのドキュメントを返します。
論理演算子の詳細については、 MongoDB Serverマニュアルの「 論理クエリ演算子 」ガイドを参照してください。
次の例では、クエリフィルターで論理演算子を find() メソッドへのパラメーターとして指定します。このコードは、qtyフィールドの値が 5 より大きいか、または colorフィールドの値が "yellow" であるすべてのドキュメントを返します。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
results = collection.find({ "$or": [ { "qty": { "$gt": 5 }}, { "color": "yellow" } ]})
for f in results: print(f)results = collection.find({ "$or": [ { "qty": { "$gt": 5 }}, { "color": "yellow" } ]})
async for f in results: print(f)配列演算子
配列演算子は、配列フィールド内の要素の値または量に基づいてドキュメントを一致させます。 以下は、使用可能な配列演算子のリストです。
$allは、クエリ内のすべての要素を含む配列を持つドキュメントを返します$elemMatchは、配列フィールド内の要素がクエリ内のすべての条件に一致する場合にドキュメントを返します。$sizeは、指定されたサイズの配列を持つすべてのドキュメントを返します
配列演算子の詳細については、MongoDB Server マニュアルの「 配列クエリ演算子 」ガイドを参照してください。
次の例では、クエリフィルターを find() メソッドへのパラメーターとして指定しています。このコードは、2 要素を含む type 配列フィールドを持つすべてのドキュメントを返します。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
results = collection.find({ "type" : { "$size": 2 }})
for f in results: print(f)results = collection.find({ "type" : { "$size": 2 }})
async for f in results: print(f)要素演算子
要素演算子は、フィールドの存在または型に基づいてデータをクエリします。
要素演算子の詳細については、 MongoDB Serverマニュアルの「 要素クエリ演算子 」ガイドを参照してください。
次の例では、クエリフィルター内の要素演算子を find() メソッドへのパラメーターとして指定しています。コードは、colorフィールドを持つすべてのドキュメントを返します。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
results = collection.find( { "color" : { "$exists": "true" }} )
for f in results: print(f)results = collection.find( { "color" : { "$exists": "true" }} )
async for f in results: print(f)評価演算子
評価演算子は、個々のフィールドまたはコレクションのドキュメント全体の評価に基づいてデータを返します。
以下は、一般的な評価演算子のリストです。
$textは、ドキュメントに対してテキスト検索を実行します$regexは、指定された正規表現に一致するドキュメントを返します$modは、フィールドの値に対して剰余演算を実行し、余りが指定された値であるドキュメントを返します
評価演算子の完全なリストを表示するには、 マニュアルの「 評価クエリ演算子MongoDB Server 」ガイドを参照してください。
次の例では、クエリフィルターで評価演算子を find() メソッドへのパラメーターとして指定しています。このコードでは正規式を使用して、少なくともname 2 文字が連続する"p" フィールド値を持つすべてのドキュメントが返されます。対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。
results = collection.find({ "name" : { "$regex" : "p{2,}" }} )
for f in results: print(f)results = collection.find({ "name" : { "$regex" : "p{2,}" }} )
async for f in results: print(f)トラブルシューティング
Web アプリケーションで ObjectId を使用してドキュメントをクエリしても結果がない
次のコード例に示すように、ウェブ アプリケーションでは URL でドキュメントの ObjectId をエンコードするのが一般的です。
"/posts/50b3bda58a02fb9a84d8991e"ウェブ フレームワークは、URL の ObjectId 部分を string としてリクエスト ハンドラーに渡します。 string をfind_one()メソッドに渡す前に、 ObjectIdインスタンスに変換する必要があります。
次のコード例は、Flaskアプリケーションでこの変換を実行する方法を示しています。プロセスは他のウェブ フレームワークでも同様です。
from pymongo import MongoClientfrom bson.objectid import ObjectId
from flask import Flask, render_template
client = MongoClient()app = Flask(__name__)
app.route("/posts/<_id>")def show_post(_id): # NOTE!: converting _id from string to ObjectId before passing to find_one post = client.db.posts.find_one({'_id': ObjectId(_id)}) return render_template('post.html', post=post)
if __name__ == "__main__": app.run()詳細情報
ドキュメントのクエリの詳細については、MongoDB Server マニュアルの 「ドキュメントのクエリ」 ガイドを参照してください。
PyMongoによるドキュメントの検索の詳細については、ドキュメントの検索を参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。