首页 > 解决方案 > 如何使用查找或聚合查询对象是否在mongodb中有嵌套的对象数组

问题描述

下面的对象有关键职责。我想从员工集合中获取员工详细信息。到目前为止,我尝试了许多查询与管道查找的组合。如何使用查找或聚合编写查询

集合有下面提到的对象数据

{
"_id" : ObjectId("61332cbcf509434a28b1e42e"),
"name" : "Company 1",
"dutys" : [ 
    {
        "_id" : ObjectId("61332cbcf509434a28b1e437"),
        "duty_name" : "Front",
        "emp_ids" : [ 
            ObjectId("613329c9c2cd9949d3a7c630"), 
            ObjectId("613329c9c2cd9949d3a7c631"), 
            ObjectId("613329c9c2cd9949d3a7c632")
        ]
    }, 
    {
        "_id" : ObjectId("61332cbcf509434a28b1e438"),
        "duty_name" : "Cleaning",
        "emp_ids" : [ 
            ObjectId("613329c9c2cd9949d3a7c633"), 
            ObjectId("613329c9c2cd9949d3a7c634")
        ],
    }
  ]
}

我想要带有员工详细信息的预期输出例如预期输出

{
"_id" : ObjectId("61332cbcf509434a28b1e42e"),
"name" : "Company 1",
"dutys" : [ 
    {
        "_id" : ObjectId("61332cbcf509434a28b1e437"),
        "duty_name" : "Front",
        "emp_ids" : [ 
            {
               _id: ObjectId("613329c9c2cd9949d3a7c630"),
               name: "Emp 1",
            },
            {
               _id: ObjectId("613329c9c2cd9949d3a7c631"),
               name: "Emp 2",
            },
            {
               _id: ObjectId("613329c9c2cd9949d3a7c632"),
               name: "Emp 3",
            }
        ]
    }, 
    {
        "_id" : ObjectId("61332cbcf509434a28b1e438"),
        "duty_name" : "Cleaning",
        "emp_ids" : [ 
            {
               _id: ObjectId("613329c9c2cd9949d3a7c633"),
               name: "Emp 4",
            },
            {
               _id: ObjectId("613329c9c2cd9949d3a7c634"),
               name: "Emp 5",
            }
        ],
    }
  ]
}

标签: mongodbmongoosemongodb-query

解决方案


unwind破坏数组

lookup放置原始数据而不是 _id

project添加字段

group创建最终数据

db.collection('company').aggregate({
[
  {
    '$unwind': {
      'path': '$dutys'
    }
  }, {
    '$lookup': {
      'from': 'emp',  // emp collection name
      'localField': 'dutys.emp_ids', 
      'foreignField': '_id', 
      'as': 'st'
    }
  }, {
    '$project': {
      'name': 1, 
      'dutys.duty_name': 1, 
      'dutys._id': 1, 
      'dutys.emp_ids': {
        '$map': {
          'input': '$st', 
          'as': 'z', 
          'in': {
            '_id': '$$z._id', 
            'name': '$$z.name'
          }
        }
      }
    }
  }, {
    '$group': {
      '_id': '$name', 
      'dutys': {
        '$push': '$dutys'
      }
    }
  }
]})

推荐阅读