以前にリンクされたデュープから(可能性あり)
、 $ where
を使用したソリューション
続く:
db.collection.find({
"$where": function() {
self = this;
return this.actors.filter(function(actor) {
return self.director._id === actor._id;
}).length > 0
}
})
そして、集約フレームワークを使用する他の提案されたアプローチ $ redact
パイプライン:
db.collection.aggregate([
{
"$redact": {
"$cond": [
{
"$setIsSubset": [
["$director._id"],
{
"$map": {
"input": "$actors",
"as": "el",
"in": "$$el._id"
}
}
]
},
"$$KEEP",
"$$PRUNE"
]
}
}
])
上記では、 <の条件ロジックcode> $ redact
セット演算子を使用して実行されます $ setIsSubset
$ map
>
$ map
>
演算子は、actors
からのアクターIDのみを含む配列を返します 配列内の各要素に式を適用した後の配列。たとえば、式
{
"$map": {
"input": "$actors",
"as": "el",
"in": "$$el._id"
}
}
アクター配列に適用された場合
[
{
"_id" : "artist:3",
"first_name" : "James",
"last_name" : "Stewart",
"birth_date" : "1908",
"role" : "John Ferguson"
},
{
"_id" : "artist:16",
"first_name" : "Kim",
"last_name" : "Novak",
"birth_date" : "1925",
"role" : "Madeleine Elster"
},
{
"_id" : "artist:282",
"first_name" : "Arthur",
"last_name" : "Pierre",
"birth_date" : null,
"role" : null
}
]
戻ります
[ "artist:3", "artist:16", "artist:282" ]
この結果は、単一の要素配列 ["$directors._id"]
と比較されます。 $ setIsSubset コード>
2つの配列を取り、最初の配列が2番目の配列と等しい場合を含め、最初の配列が2番目の配列のサブセットである場合はtrueを返し、それ以外の場合はfalseを返す演算子。
たとえば、
{
"$setIsSubset": [
[ "artist:12" ],
[ "artist:3", "artist:16", "artist:282" ]
]
} // false
{
$setIsSubset: [
[ "artist:282" ],
[ "artist:3", "artist:16", "artist:282" ]
]
} // true
演算子からのブール結果は、 $ redact
パイプライン。
パフォーマンスの説明は引き続き保持されます: $ where
必要に応じてハックするのは良いことですが、可能な限り避ける必要があります。