このページの例は、Atlas Function でMongoDB Query APIを使用して Atlas クラスターからドキュメントを読み取る方法を示しています。
Learn about the methods that you can call to query data, the operators that let you write expressive match filters, and some patterns for combining them to handle common use cases.
データモデル
このページの例では、オンライン ストアで購入可能なさまざまなアイテムをモデル化したstore.itemsという名前のコレクションを使用します。 各アイテムには、 name 、在庫quantity 、カスタマーの配列reviewsがあります。
{ "title": "Item", "required": ["_id", "name", "quantity", "reviews"], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "quantity": { "bsonType": "int" }, "reviews": { "bsonType": "array", "items": { "bsonType": "object", "required": ["username", "comment"], "properties": { "username": { "bsonType": "string" }, "comment": { "bsonType": "string" } } } } } }
スニペットのセットアップ
関数でコード スニペットを使用するには、まず MongoDB コレクション ハンドルをインスタンス化する必要があります。
exports = function() { const mongodb = context.services.get("mongodb-atlas"); const itemsCollection = mongodb.db("store").collection("items"); const purchasesCollection = mongodb.db("store").collection("purchases"); // ... paste snippet here ... }
クエリメソッド
単一ドキュメントの検索(findOne() )
collection.findOne()メソッドを使用して単一のドキュメントを見つけることができます。
次の 関数 スニペットは、items コレクションから、quantity 25が 以上のドキュメントを 1 つ検索します。
const query = { "quantity": { "$gte": 25 } }; const projection = { "title": 1, "quantity": 1, } return itemsCollection.findOne(query, projection) .then(result => { if(result) { console.log(`Successfully found document: ${result}.`); } else { console.log("No document matches the provided query."); } return result; }) .catch(err => console.error(`Failed to find document: ${err}`));
1件以上のドキュメントを特定(find())
collection.find()メソッドを使用して複数のドキュメントを見つけることができます。
次の関数スニペットは、 itemsコレクション内で少なくとも 1 件のレビューがあるすべてのドキュメントを検索し、 _idフィールドを省略してnameでソートされて返します。
const query = { "reviews.0": { "$exists": true } }; const projection = { "_id": 0 }; return itemsCollection.find(query, projection) .sort({ name: 1 }) .toArray() .then(items => { console.log(`Successfully found ${items.length} documents.`) items.forEach(console.log) return items }) .catch(err => console.error(`Failed to find documents: ${err}`))
コレクション内のドキュメントをカウントする(count() )
collection.count()メソッドを使用してコレクション内のドキュメントをカウントできます。 どのドキュメントをカウントするかを制御するクエリを指定できます。 クエリを指定しない場合、 メソッドはコレクション内のすべてのドキュメントをカウントします。
次の関数スニペットは、 itemsコレクション内の少なくとも 1 件のレビューがあるドキュメントの数をカウントします。
return itemsCollection.count({ "reviews.0": { "$exists": true } }) .then(numDocs => console.log(`${numDocs} items have a review.`)) .catch(err => console.error("Failed to count documents: ", err))
クエリ パターン
ドキュメント ID による検索
コレクションをクエリして、指定された ID を持つドキュメントを検索できます。 MongoDB は、各ドキュメントの ID をドキュメントの_idフィールドにObjectId値として自動的に保存します。
{ "_id": <ObjectId> }
例
次のクエリは、 _idの値が5ad84b81b8b998278f773c1bである コレクション内のドキュメントに一致します。
{ "_id": BSON.ObjectId("5ad84b81b8b998278f773c1b") }
日付で検索
コレクションをクエリして、特定の日付値を持つフィールドを持つドキュメントを検索したり、日付の範囲内のドキュメントをクエリしたりできます。
{ "<Date Field Name>": <Date | Expression> }
例
次のクエリでは、 createdAt日付が 2019 年 1 月 23 日である コレクション内のドキュメントに一致します。
{ "createdAt": new Date("2019-01-23T05:00:00.000Z") }
例
次のクエリは、2019 年のある時点でcreatedAt日付を持つ コレクション内のドキュメントに一致します。
{ "createdAt": { "$gte": new Date("2019-01-01T00:00:00.000Z"), "$lt": new Date("2020-01-01T00:00:00.000Z"), } }
ルート レベル フィールドの一致
各ドキュメントのルートレベル フィールドの値に基づいて、コレクションをクエリできます。 MongoDB が各ドキュメントに対して評価する特定の値またはネストされた式のいずれかを指定できます。
詳細については、MongoDB Server マニュアルの「クエリ ドキュメント 」チュートリアルを参照してください。
{ "<Field Name>": <Value | Expression> }
例
次のクエリは、 nameフィールドの値がBasketballであるドキュメントに一致します。
{ "name": "Basketball" }
複数のフィールドに一致
1 つのクエリ ドキュメントに複数のクエリ条件を指定できます。 クエリ ドキュメントの各ルート レベル フィールドは、 コレクション内のフィールドにマップされます。 MongoDB は、すべてのクエリ条件を満たすドキュメントのみを返します。
詳細については、 マニュアルの 「 埋め込み/ネストされたドキュメントへのクエリMongoDB Server 」 チュートリアルを参照してください。
{ "<Field Name 1>": <Value | Expression>, "<Field Name 2>": <Value | Expression> }
例
次のクエリは、 nameフィールドの値がBasketballで、かつquantityの値が 0 より大きいドキュメントに一致します。
{ "name": "Basketball", "quantity": { "$gt": 0 } }
埋め込みドキュメント フィールドへの一致
You can query a collection based on the value of embedded document fields. To specify an embedded document field, use multiple nested query expressions or standard document dot notation.
詳細については、 マニュアルの 「 埋め込み/ネストされたドキュメントへのクエリMongoDB Server 」 チュートリアルを参照してください。
{ "<Field Name>": { "<Nested Field Name>": <Value | Expression> } }
{ "<Field Name>.<Nested Field Name>": <Value | Expression> }
例
次のクエリは、 reviews配列内の最初のレビューがユーザー名JoeMangoを持つユーザーによって左にあるドキュメントに一致します。
{ "reviews.0.username": "JoeMango" }
値の配列の一致
配列フィールドに含まれるすべての要素に基づいてコレクションをクエリできます。
If you query an array field for a specific array of values, MongoDB returns documents where the array field exactly matches the specified array of values. If you want MongoDB to return documents where the array field contains all elements in the specified array of values, use the $all operator.
For more information, see the Query an Array tutorial in the MongoDB Server Manual.
{ "<Array Field Name>": [<Value>, ...] }
例
次のクエリは、 reviews配列に 1 つの要素のみが含まれ、その要素が指定されたドキュメントと一致するドキュメントに一致します。
{ "reviews": [{ username: "JoeMango", comment: "This rocks!" }] }
例
次のクエリは、 reviews配列に、指定されたすべてのドキュメントに一致する要素が 1 つ以上含まれているドキュメントに一致します。
{ "reviews": { "$all": [{ username: "JoeMango", comment: "This rocks!" }] } }
配列要素の一致
配列フィールド内の 1 つ以上の要素の値に基づいて、コレクションをクエリできます。
If you query an array field with a query expression that has multiple conditions, MongoDB returns documents where any combination of the array's elements satisfy the expression. If you want MongoDB to return documents where a single array element satisfies all of the expression conditions, use the $elemMatch operator.
For more information, see the Query an Array tutorial in the MongoDB Server Manual.
{ "<Array Field Name>": <Value | Expression> }
例
次のクエリは、埋め込み 式内の両方の条件が、 reviews配列内の要素の任意の組み合わせによって満たされるドキュメントに一致します。 指定されたusernameとcommentの値は同じドキュメント内に存在する必要はありません。
{ "reviews": { "username": "JoeMango", "comment": "This is a great product!" } }
例
次のクエリは、埋め込み式内の両方の条件がreviews配列内の単一の要素によって満たされるドキュメントに一致します。 指定されたusernameとcommentは同じドキュメント内になければなりません。
{ "reviews": { "$elemMatch": { "username": "JoeMango", "comment": "This is a great product!" } } }
クエリ演算子
Compare Values
比較演算子を使用して、ドキュメント フィールドの値を別の値と比較できます。
{ "<Field Name>": { "<Comparison Operator>": <Comparison Value> } }
次の比較演算子が利用できます。
比較演算子 | 説明 |
|---|---|
フィールドの値が指定された値と等しいドキュメントと一致します。 | |
フィールドの値が指定された値と等しくないドキュメントと一致します。 | |
フィールドの値が指定された値を超えるドキュメントと一致します。 | |
フィールドの値が指定値以上のドキュメントと一致します。 | |
フィールドの値が指定された値未満であるドキュメントと一致します。 | |
フィールドの値が指定値以下のドキュメントと一致します。 | |
フィールドの値が指定された値の配列に含まれているドキュメントと一致します。 | |
フィールドの値が指定された値の配列に含まれていないドキュメントと一致します。 |
例
次のクエリは、 quantityが 0 より大きく 10 より小さいドキュメントに一致します。
{ "quantity": { "$gt": 0, "$lte": 10 } }
論理式の評価
論理演算子を使用して、単一のフィールドの複数の式を評価できます。
{ "<Field Name>": { "<Logical Operator>": [<Expression>, ...] } }
次の論理演算子が使用できます。
論理演算子 | 説明 |
|---|---|
フィールドの値が指定されたすべての式と一致するドキュメントと一致します。 | |
フィールドの値が指定された式のいずれかに一致するドキュメントと一致します。 | |
フィールドの値が指定された式のいずれにも一致しないドキュメントと一致します。 | |
指定された論理式のブール値結果を反転します。 |
例
次のクエリは、 quantityが 0 より大きいか、 またはreviews配列に 5 個以下のドキュメントが含まれるドキュメントに一致します。
{ "$or": [ { "quantity": { "$gt": 0 } }, { "reviews": { "$size": { "$lte": 5 } } } ] }
正規式を評価する
$regexクエリ演算子を使用して、 正規式と一致するフィールドを含むドキュメントを返すことができます。$regex EJSON 型のあいまいさを避けるには、atlas- BSON.BSONRegExpオブジェクト を使用する必要があります。
{ "<Field Name>": { "$regex": BSON.BSONRegExp(<RegEx String>, <RegEx Options>) } }
例
次のクエリは、 name値に部分文字列ballが含まれるドキュメントに一致します(大文字と小文字を区別しない)。
{ "name": { "$regex": BSON.BSONRegExp(".+ball", "i") } }