से (संभव)
, $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"
]
}
}
])
उपरोक्त में, <के लिए कंडीशन लॉजिक कोड>$रिडक्ट
सेट ऑपरेटरों के उपयोग के माध्यम से किया जाता है $setIsSubset
और $map
.
$map
ऑपरेटर अभिनेताओं
. से केवल अभिनेता आईडी के साथ एक सरणी लौटाएगा सरणी में प्रत्येक तत्व के लिए एक अभिव्यक्ति लागू करने के बाद सरणी। तो उदाहरण के लिए, व्यंजक
{
"$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का उपयोग करके कोड>
ऑपरेटर जो दो सरणियों को लेता है और सत्य लौटाता है जब पहली सरणी दूसरे का सबसेट होती है, जिसमें पहली सरणी दूसरी सरणी के बराबर होती है, और अन्यथा झूठी होती है।
उदाहरण के लिए,
{
"$setIsSubset": [
[ "artist:12" ],
[ "artist:3", "artist:16", "artist:282" ]
]
} // false
{
$setIsSubset: [
[ "artist:282" ],
[ "artist:3", "artist:16", "artist:282" ]
]
} // true
इसके बाद ऑपरेटर के बूलियन परिणाम को $redact
पाइपलाइन।
प्रदर्शन के लिए स्पष्टीकरण अभी भी कायम है:$where
आवश्यक होने पर एक अच्छा हैक है, लेकिन जब भी संभव हो इससे बचना चाहिए।