Je kunt nog steeds aggregate()
. gebruiken hier met MongoDB 3.2, maar alleen met behulp van $redact
in plaats daarvan:
db.boards.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$and": [
{ "$ne": [ "$createdBy._id", "$owner._id" ] },
{ "$setIsSubset": [["$createdBy._id"], "$acl.profile._id"] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Of met $where
voor de MongoDB 3.2-shell hoef je alleen maar een scoped kopie van this
te bewaren , en je syntaxis was een beetje verkeerd:
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
})
}
})
Of in een ES6-compatibele omgeving:
db.boards.find({
"$where": function() {
return (this.createdBy._id != this.owner._id)
&& this.acl.some(e => e.profile._id === this.createdBy._id)
}
})
Het aggregaat is de meest performante optie van de twee en zou altijd de voorkeur moeten hebben boven het gebruik van JavaScript-evaluatie
En voor wat het waard is, de nieuwere syntaxis met $expr
zou zijn:
db.boards.find({
"$expr": {
"$and": [
{ "$ne": [ "$createdBy._id", "$owner._id" ] },
{ "$in": [ "$createdBy._id", "$acl.profile._id"] }
]
}
})
$in
gebruiken
in plaats van $setIsSubset
waar de syntaxis iets korter is.
return (this.createdBy._id.valueOf() != this.owner._id.valueOf())
&& this.acl.some(e => e.profile._id.valueOf() === this.createdBy._id.valueOf())