MongoDB Atlas からデータを読み取る - 関数
項目一覧
このページの例は、Atlas Function でMongoDB Query APIを使用して Atlas クラスターからドキュメントを読み取る方法を示しています。
データをクエリするために呼び出すことができるメソッド、表現的な一致フィルターを記述できる演算子、およびそれらを組み合わせて一般的なユースケースを処理するためのいくつかのパターンについて説明します。
データモデル
このページの例では、オンライン ストアで購入可能なさまざまなアイテムをモデル化した 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 } }
埋め込みドキュメント フィールドへの一致
埋め込みドキュメント フィールドの値に基づいてコレクションをクエリできます。 埋め込みドキュメントフィールドを指定するには、複数のネストされたクエリ式または標準ドキュメントドット表記 を使用します。
詳細については、 マニュアルの 「 埋め込み/ネストされたドキュメントへのクエリMongoDB Server 」 チュートリアルを参照してください。
{ "<Field Name>": { "<Nested Field Name>": <Value | Expression> } }
{ "<Field Name>.<Nested Field Name>": <Value | Expression> }
例
次のクエリは、 reviews
配列内の最初のレビューがユーザー名JoeMango
を持つユーザーによって左にあるドキュメントに一致します。
{ "reviews.0.username": "JoeMango" }
値の配列の一致
配列フィールドに含まれるすべての要素に基づいてコレクションをクエリできます。
配列フィールドで特定の値の配列をクエリすると、MongoDB は、配列フィールドが指定された値の配列と完全に一致するドキュメントを返します。 MongoDB が配列フィールド に指定された値の配列内のすべての要素を含むドキュメントを返す場合は、 $all演算子を使用します。
詳細については、 マニュアルの「 配列のクエリMongoDB Server 」チュートリアルを参照してください。
{ "<Array Field Name>": [<Value>, ...] }
例
次のクエリは、 reviews
配列に 1 つの要素のみが含まれ、その要素が指定されたドキュメントと一致するドキュメントに一致します。
{ "reviews": [{ username: "JoeMango", comment: "This rocks!" }] }
例
次のクエリは、 reviews
配列に、指定されたすべてのドキュメントに一致する要素が 1 つ以上含まれているドキュメントに一致します。
{ "reviews": { "$all": [{ username: "JoeMango", comment: "This rocks!" }] } }
配列要素の一致
配列フィールド内の 1 つ以上の要素の値に基づいて、コレクションをクエリできます。
複数の条件を持つクエリ式で配列フィールドをクエリすると、MongoDB は配列の要素の任意の組み合わせが式を満たすドキュメントを返します。 1 つの配列要素がすべての式条件を満たすドキュメントを MongoDB が返す場合は、 $elemMatch演算子を使用します。
詳細については、 マニュアルの「 配列のクエリMongoDB Server 」チュートリアルを参照してください。
{ "<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") } }