【问题标题】:$lookup for each element in array mongo aggregation$lookup 查找数组 mongodb 聚合中的每个元素
【发布时间】:2019-02-02 04:21:30
【问题描述】:

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

{
    "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 mongoose aggregation


【解决方案1】:

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

【讨论】:

  • 它没有得到预期的结果,因为 people 是一个数组,而您的解决方案的输出只是一个数组
  • 非常感谢,我使用$addToSet而不是$push提供信息
猜你喜欢
  • 2019-07-10
  • 2021-08-04
  • 2019-10-25
  • 2022-01-05
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 2017-03-12
相关资源
最近更新 更多