:
Message.aggregate([
{ "$match": {
"enabled": true,
"deleted": false
}},
{ "$lookup": {
"from": "users",
"localField": "user",
"foreignField": "_id",
"as": "user"
}},
{ "$unwind": "user" },
{ "$redact": {
"if": "$user.showMessage",
"then": "$$KEEP",
"else": "$$PRUNE"
}}
],function(err,messages) {
if (err) reject(err);
})
, $unwind ( $lookup " ", $redact , true/false.
$lookup , :
User.aggregate([
{ "$match": { "showMessage": true } },
{ "$lookup": {
"from": "messages",
"localField": "_id",
"foreignField": "user",
"as": "messages"
}},
{ "$unwind": "$messages" },
{ "$match": {
"messages.enabled": true,
"messages.deleted": false
}},
{ "$project": {
"_id": "$messages._id",
"user": {
"_id": "$_id",
"email": "$email",
"showMessage": "$showMessage"
},
"text": "$messages.text",
"deleted": "$messages.deleted",
"enabled": "$messages.enabled"
}}
],function(err,messages) {
})
$lookup "" - , "" "", " . .
"" .
- "reverse", _id User , . , , $in :
async.waterfall
[
function(callback) {
User.find({ "showMesage": true }).select("_id").exec(callback);
},
function(users,callback) {
Message.find({
"user": { "$in": users.map((current) => { return current._id }) },
"enabled": true,
"deleted": false
}).populate("user").exec(callback);
}
],function(err,messages) {
}
)
$lookup, .
, , , . , "" $lookup $in . , , "" .