ANNOUNCEMENT: Voyage AI joins MongoDB to power more accurate and trustworthy AI applications on Atlas.
Learn more
Docs Menu

クエリを指定する

このガイドでは、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" },

次のコード例は、データベースとコレクションを作成し、サンプル ドキュメントをコレクションに挿入する方法を示しています。

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)

リテラル値クエリは、クエリフィルターに完全に一致するドキュメントを返します。

次の例えでは、 find()メソッドのパラメーターとしてクエリフィルターを指定します。 このコードでは、 colorフィールドの値が"yellow"であるすべてのドキュメントが返されます。

results = collection.find({ "color": "yellow" })
{'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']}
{'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, '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)
{'_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': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}

論理演算子は、2 つ以上の式のセットの結果に適用されたロジックを使用してドキュメントを一致させます。 以下は論理演算子のリストです。

  • $andは、すべての句の条件に一致するすべてのドキュメントを返します

  • $or1 つの句の条件に一致するすべてのドキュメントを返します

  • $norは、どの句の条件にも一致しないすべてのドキュメントを返します。

  • $notは、式に一致しないすべてのドキュメントを返します

論理演算子の詳細については、 MongoDB Serverマニュアルの「 論理クエリ演算子 」ガイドを参照してください。

次の例えでは、クエリフィルターで論理演算子をfind()メソッドへのパラメーターとして指定します。 このコードでは、 qtyフィールドの値が5より大きいか、またはcolorフィールドの値が"yellow"であるすべてのドキュメントが返されます。

results = collection.find({
"$or": [
{ "qty": { "$gt": 5 }},
{ "color": "yellow" }
]
})
for f in results:
print(f)
{'_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'}

配列演算子は、配列フィールド内の要素の値または量に基づいてドキュメントを一致させます。 以下は、使用可能な配列演算子のリストです。

  • $allは、クエリ内のすべての要素を含む配列を持つドキュメントを返します

  • $elemMatchは、配列フィールド内の要素がクエリ内のすべての条件に一致する場合にドキュメントを返します

  • $sizeは、指定されたサイズの配列を持つすべてのドキュメントを返します

配列演算子の詳細については、MongoDB Server マニュアルの「 配列クエリ演算子 」ガイドを参照してください。

次の例では、クエリフィルター内の配列演算子をfind()メソッドへのパラメーターとして指定しています。 このコードでは、 要素を含む 配列フィールドを持つすべてのドキュメントが返されます。type2

results = collection.find({
"type" : { "$size": 2 }
})
for f in results:
print(f)
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']}
{'_id': 3, 'name': 'oranges', 'qty': 6, 'rating': 2, 'type': ['naval', 'mandarin']}

要素演算子は、フィールドの存在または型に基づいてデータをクエリします。

要素演算子の詳細については、 MongoDB Serverマニュアルの「 要素クエリ演算子 」ガイドを参照してください。

次の例では、クエリフィルター内の要素演算子をfind()メソッドへのパラメーターとして指定しています。 このコードでは、 colorフィールドを持つすべてのドキュメントが返されます。

results = collection.find( { "color" : { "$exists": "true" }} )
for f in results:
print(f)
{'_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': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}

評価演算子は、個々のフィールドまたはコレクションのドキュメント全体の評価に基づいてデータを返します。

以下は、一般的な評価演算子のリストです。

  • $textは、ドキュメントに対してテキスト検索を実行します

  • $regexは、指定された正規表現に一致するドキュメントを返します

  • $modは、フィールド値に対して剰余演算を実行し、余りが指定された値であるドキュメントを返します

評価演算子の完全なリストを表示するには、 マニュアルの「 評価クエリ演算子MongoDB Server 」ガイドを参照してください。

次の例では、クエリフィルターで評価演算子をfind()メソッドへのパラメーターとして指定しています。 このコードでは正規表現を使用して、少なくとも 2 文字が連続する"p" nameフィールド値を持つすべてのドキュメントが返されます。

results = collection.find({ "name" : { "$regex" : "p{2,}" }} )
for f in results:
print(f)
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']}
{'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}

次のコード例に示すように、ウェブ アプリケーションでは URL でドキュメントの ObjectId をエンコードするのが一般的です。

"/posts/50b3bda58a02fb9a84d8991e"

ウェブ フレームワークは、URL の ObjectId 部分を string としてリクエスト ハンドラーに渡します。 string をfind_one()メソッドに渡す前に、 ObjectIdインスタンスに変換する必要があります。

次のコード例は、 Flask でこの変換を実行する方法を示しています。 アプリケーション。プロセスは他のウェブ フレームワークでも同様です。

from pymongo import MongoClient
from 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 ドキュメントを参照してください。