クエリを指定する
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" },
次のコード例は、データベースとコレクションを作成し、サンプル ドキュメントをコレクションに挿入する方法を示しています。
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
は、すべての句の条件に一致するすべてのドキュメントを返します。$or
は、 1 つの句の条件に一致するすべてのドキュメントを返します$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()
メソッドへのパラメーターとして指定しています。 このコードでは、 要素を含む 配列フィールドを持つすべてのドキュメントが返されます。type
2
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'}
詳細情報
ドキュメントのクエリの詳細については、MongoDB Server マニュアルの 「ドキュメントのクエリ」 ガイドを参照してください。
PyMongo を使用してドキュメントを取得する方法の詳細については、「 データの取得 」を参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。