Puoi ancora usare aggregate()
qui con MongoDB 3.2, ma semplicemente usando $redact
invece:
db.boards.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$and": [
{ "$ne": [ "$createdBy._id", "$owner._id" ] },
{ "$setIsSubset": [["$createdBy._id"], "$acl.profile._id"] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Oppure con $where
per la shell MongoDB 3.2, devi solo conservare una copia con scope di this
, e la tua sintassi era un po' storta:
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
})
}
})
Oppure in un ambiente compatibile con ES6 quindi:
db.boards.find({
"$where": function() {
return (this.createdBy._id != this.owner._id)
&& this.acl.some(e => e.profile._id === this.createdBy._id)
}
})
L'aggregato è l'opzione più performante delle due e dovrebbe essere sempre preferibile all'utilizzo della valutazione JavaScript
E per quel che vale, la nuova sintassi con $expr
sarebbe:
db.boards.find({
"$expr": {
"$and": [
{ "$ne": [ "$createdBy._id", "$owner._id" ] },
{ "$in": [ "$createdBy._id", "$acl.profile._id"] }
]
}
})
Utilizzo di $in
in preferenza a $setIsSubset
dove la sintassi è un po' più breve.
return (this.createdBy._id.valueOf() != this.owner._id.valueOf())
&& this.acl.some(e => e.profile._id.valueOf() === this.createdBy._id.valueOf())