私はそのようなドキュメントのコレクションを持っています:
{
"_id": ObjectId("xxxxx"),
"item": [
{ "property": ["attr1", "+1"] },
{ "property": ["attr2", "-1"] }
]
}
{
"_id": ObjectId("xxxxy"),
"item": [
{ "property": ["attr1", "-1"] },
{ "property": ["attr2", "0"] }
]
}
{
"_id": ObjectId("xxxxz"),
"item": [
{ "property": ["attr1", "0"] },
{ "property": ["attr2", "+1"] }
]
}
できれば集計パイプラインを使用して、プロパティのいずれかが複数の条件に一致する場合にのみ、ドキュメントを一致させる方法はありますか?
たとえば、配列内の1つのオブジェクトが次の両方の条件に一致するクエリが必要です。
("item.property": "attr1") AND ("item.property": /^\+/)
つまり、「attr1」と「+」で始まる要素を含む単一のプロパティです。
ただし、次のような現在のクエリを使用します。
collection.aggregate(
{ $match:
{ $and:
[
{ "item.property": "attr1" },
{ "item.property": /^\+/ }
]
}
}
これは、最初と最後のドキュメントの両方に一致します。これは、両方に「attr1」のプロパティと「+」のステータスを持つ要素が含まれているためです。ただし、「+」で始まる要素は配列内の同じオブジェクトに属していないため、このクエリを最後のドキュメントと一致させたくありません。
集約フレームワークを使用してこの動作を実現する方法はありますか?
以下のクエリをで使用して$elemMatch
、配列の両方の値を一致させることができます。
何かのようなもの
db.collection_name.aggregate({
"$match": {
"item": {
"$elemMatch": {
"property.0": "attr1",
"property.1": /^\+/
}
}
}
});
また、$all
配列インデックスを参照したくない場合は、演算子を使用できます。
db.collection_name.aggregate({
"$match": {
"item": {
"$elemMatch": {
"property": {
"$all": [
"attr1",
/^\+/
]
}
}
}
}
});
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加