引き続きaggregate()
を使用できます ここではMongoDB3.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シェルの場合、 this
のスコープ付きコピーを保持する必要があります。 、そしてあなたの構文は少しずれていました:
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)
}
})
集約は2つの中で最もパフォーマンスの高いオプションであり、JavaScript評価を使用するよりも常に望ましいはずです
そして、その価値については、 $expr<を使用した新しい構文です。 / code>
次のようになります:
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())