आप अभी भी एग्रीगेट ()
का उपयोग कर सकते हैं यहां MongoDB 3.2 के साथ, लेकिन केवल $redact
इसके बजाय:
db.boards.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$and": [
{ "$ne": [ "$createdBy._id", "$owner._id" ] },
{ "$setIsSubset": [["$createdBy._id"], "$acl.profile._id"] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
या $where
के साथ
MongoDB 3.2 शेल के लिए, आपको बस इस
. की एक स्कोप्ड कॉपी रखनी होगी , और आपका सिंटैक्स थोड़ा हटकर था:
db.boards.find({
"$where": function() {
var self = this;
return (this.createdBy._id != this.owner._id)
&& this.acl.some(function(e) {
return e.profile._id === self.createdBy._id
})
}
})
या फिर ES6 संगत वातावरण में:
db.boards.find({
"$where": function() {
return (this.createdBy._id != this.owner._id)
&& this.acl.some(e => e.profile._id === this.createdBy._id)
}
})
समुच्चय दोनों में से सबसे अधिक प्रदर्शन करने वाला विकल्प है और हमेशा जावास्क्रिप्ट मूल्यांकन का उपयोग करने के लिए बेहतर होना चाहिए
और इसके लायक क्या है, $expr<के साथ नया सिंटैक्स /कोड>
होगा:
db.boards.find({
"$expr": {
"$and": [
{ "$ne": [ "$createdBy._id", "$owner._id" ] },
{ "$in": [ "$createdBy._id", "$acl.profile._id"] }
]
}
})
$in
का इस्तेमाल करना
वरीयता में $setIsSubset
जहां वाक्य रचना थोड़ा छोटा है।
return (this.createdBy._id.valueOf() != this.owner._id.valueOf())
&& this.acl.some(e => e.profile._id.valueOf() === this.createdBy._id.valueOf())