標準クエリでは、ドキュメント内の値を「比較」することはできません。これは実際には.aggregate()
を使用して行うことです および$redact
:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$size": {
"$filter": {
"input": "$offers",
"as": "o",
"cond": { "$eq": [ "$$o.amount", "$amount" ] }
}
}},
0
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
ここでは、 $filter
を使用します。
"amount"
の値を比較します 親ドキュメント内の配列内のものに。少なくとも1つが「等しい」場合、"$$KEEP"
ドキュメント、それ以外の場合は"$$PRUNE"
最新バージョンでは、$indexOfArray
。
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$ne": [
{ "$indexOfArray": [ "$offers.amount", "$amount" ] },
-1
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
実際に「一致する配列要素」のみが必要な場合は、 $filter
投影中:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$size": {
"$filter": {
"input": "$offers",
"as": "o",
"cond": { "$eq": [ "$$o.amount", "$amount" ] }
}
}},
0
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}},
{ "$project": {
"amount": 1,
"offers": {
"$filter": {
"input": "$offers",
"as": "o",
"cond": { "$eq": [ "$$o.amount", "$amount" ] }
}
}
}}
])
ただし、主な原則はもちろん、返されるドキュメントの数をのみに「減らす」ことです。 「最優先」として条件に実際に一致するもの。そうしないと、後で破棄する結果を得るために、時間とリソースを費やしている不要な計算と作業を行っているだけです。
したがって、最初に「フィルタリング」し、次に優先順位として「再形成」します。