mongodb - $查找数组mongo聚合中的每个元素

标签 mongodb mongoose 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" }
  }}
])

关于mongodb - $查找数组mongo聚合中的每个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52042526/

相关文章:

javascript - 在谷歌图表中显示 mongodb 结果

javascript - 填充后 MongooseJS 返回空数组

python - Pandas 分组 - 值占分组总数的百分比不起作用

java - 如何在Java中使用DAO访问DB

mongodb - 将 mongodb .group 与 C# 驱动程序一起使用

javascript - MongoDB 中两个集合之间的 Diff()

node.js - Mongoose:建议的数据库架构

node.js - 如何在 Mongoose 中立即在$map之后使用$filter

elasticsearch - Elasticsearch 中的分组数据,两个键具有相同的值

python - Pandas:为具有多列的数据框实现groupby +聚合的优雅方法?