Bạn vẫn có thể sử dụng aggregate()
ở đây với MongoDB 3.2, nhưng chỉ sử dụng $redact
thay vào đó:
db.boards.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$and": [
{ "$ne": [ "$createdBy._id", "$owner._id" ] },
{ "$setIsSubset": [["$createdBy._id"], "$acl.profile._id"] }
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Hoặc với $where
đối với trình bao MongoDB 3.2, bạn chỉ cần giữ một bản sao có phạm vi của this
và cú pháp của bạn hơi sai:
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
})
}
})
Hoặc trong môi trường tương thích ES6 thì:
db.boards.find({
"$where": function() {
return (this.createdBy._id != this.owner._id)
&& this.acl.some(e => e.profile._id === this.createdBy._id)
}
})
Tổng hợp là tùy chọn hoạt động hiệu quả nhất trong hai tùy chọn và nên luôn được ưu tiên hơn khi sử dụng đánh giá JavaScript
Và đối với những gì nó đáng giá, cú pháp mới hơn với $expr
sẽ là:
db.boards.find({
"$expr": {
"$and": [
{ "$ne": [ "$createdBy._id", "$owner._id" ] },
{ "$in": [ "$createdBy._id", "$acl.profile._id"] }
]
}
})
Sử dụng $in
ưu tiên $setIsSubset
trong đó cú pháp ngắn hơn một chút.
return (this.createdBy._id.valueOf() != this.owner._id.valueOf())
&& this.acl.some(e => e.profile._id.valueOf() === this.createdBy._id.valueOf())