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

$lookup for each element in array mongo aggregation

我有用户架构,人员字段包含 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"
  }
}

那个聚合有什么问题

您可以在 mongodb 3.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" }
  }}
])