$lookup数组 mongo 聚合中的每个元素



我有用户模式,其中人员字段包含viewers属性,该属性包含 ObjectId 数组作为用户集合本身的参考

{
"username": "user1",
"password": "password",
"email": "user1@gmail.com",
"people": [{
"id": 1,
"viewers": ["ObjectId....", "ObjectId...."]
},
{
"id": 2,
"viewers": ["ObjectId....", "ObjectId...."]
}
]
}

我需要做的是$lookup对于查看器中的每个元素,问题是当我使用以下管道时,为每个文档推送相同的查看器

{
$unwind: {
path: "$people.viewers",
preserveNullAndEmptyArrays: true
}
},
{
$lookup: {
from: "users",
localField: "people.viewers",
foreignField: "_id",
as: "people"
}
},
{
$unwind: {
path: "$viewers",
preserveNullAndEmptyArrays: true
}
},
{
$project: {
username: 1,        
"viewers.username": 1    
}
},
{
$group: {
_id: "$_id",
username: { $first: "$username" },    
people: { $first: "$people" },
viewers: { $push: "$viewers" }
}
},
{
$project: {
username: 1,    
"people.id": 1,
"people.viewers": "$viewers"
}
}

该聚合中有什么问题

您可以在 mongodb3.4及更高版本中尝试以下聚合

User.aggregate([
{ "$unwind": { "path": "$people", "preserveNullAndEmptyArrays": true }},
{ "$lookup": {
"from": "users",
"localField": "people.viewers",
"foreignField": "_id",
"as": "people.viewers"
}},
{ "$group": {
"_id": "$_id",
"username": { "$first": "$username" },    
"email": { "$first": "$email" },
"people": { "$push": "$people" }
}}
])

最新更新