Docs Menu
Docs Home
/ /
Atlas App Services
/ /

MongoDB Atlas からデータを読み取る - 関数

項目一覧

  • Overview
  • データモデル
  • スニペットのセットアップ
  • クエリメソッド
  • 単一ドキュメントの検索( findOne()
  • 1 つ以上のドキュメントを検索する( find()
  • コレクション内のドキュメントをカウントする( count()
  • クエリ パターン
  • ドキュメント ID による検索
  • 日付で検索
  • ルート レベル フィールドの一致
  • 複数のフィールドに一致
  • 埋め込みドキュメント フィールドへの一致
  • 値の配列の一致
  • 配列要素の一致
  • クエリ演算子
  • Compare Values
  • 論理式の評価
  • 正規式を評価する

このページの例は、関数で MongoDB Query API を使用して Atlas クラスターからドキュメントを読み取る方法を示しています。

データをクエリするために呼び出すことができるメソッド、表現的な一致フィルターを記述できる演算子、およびそれらを組み合わせて一般的なユースケースを処理するためのいくつかのパターンについて説明します。

このページの例では、オンライン ストアで購入可能なさまざまなアイテムをモデル化した store.itemsという名前のコレクションを使用します。 各アイテムにはname 、在庫quantity 、カスタマーの配列reviewsがあります。

Store.item の JSON schema
{
"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 ...
}

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}`));

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}`))

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 を持つドキュメントを検索できます。 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配列内の要素の任意の組み合わせによって満たされるドキュメントに一致します。 指定されたusernamecommentの値は同じドキュメント内に存在する必要はありません。

{
"reviews": {
"username": "JoeMango",
"comment": "This is a great product!"
}
}

次のクエリは、埋め込み式内の両方の条件がreviews配列内の単一の要素によって満たされるドキュメントに一致します。 指定されたusernamecommentは同じドキュメント内になければなりません。

{
"reviews": {
"$elemMatch": {
"username": "JoeMango",
"comment": "This is a great product!"
}
}
}

比較演算子を使用して、ドキュメント フィールドの値を別の値と比較できます。

{ "<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 型のあいまいさを避けるには、 BSON.BSONRegExpオブジェクトを使用する必要があります。

{
"<Field Name>": {
"$regex": BSON.BSONRegExp(<RegEx String>, <RegEx Options>)
}
}

次のクエリは、 name値に部分文字列ballが含まれるドキュメントに一致します(大文字と小文字を区別しない)。

{
"name": { "$regex": BSON.BSONRegExp(".+ball", "i") }
}

戻る

MongoDB Atlas のクエリ