如何在mongodb中嵌入的数组中查询对象?

时间:2019-01-02 13:47:49

标签: mongodb

我目前正在开发一个可以控制项目的应用程序,这些项目有会议,而这些会议有参与者。

我想通过他的nomina字段咨询参与者。

项目文档对象的结构:

 {
       "id":"5c1b0616a0441f27f022bfdc",
       "name":"Project Test",
       "area":"Area",
       "date":"2019-01-01",
       "meetings":[
          {
             "id":"5c1b073d445707834699ce97",
             "objetive":"Objetive",
             "fecha":"2019-01-01",
             "participants":[
                {
                   "nomina":1,
                   "name":"Person 1",
                   "role":"Rol1",
                   "area":"area1",
                   "signature":null
                },
                {
                   "nomina":2,
                   "name":"Person 2",
                   "role":"rol 2",
                   "area":"área 2",
                   "signature":null
                }
             ]
          }
       ]
    }

预期的行为

我想通过nomina来与会人员咨询,他们知道项目的id,也知道会议的id

预期产量

具有:

  • id项目= 5c1b0616a0441f27f022bfdc
  • id会议= 5c1b073d445707834699ce97
  • nomina参与者= 1

预计查询将返回我:

{    
"nomina":1,             
"name":"Person 1",
"role":"Rol1",
"area":"area1",
"signature":null
}

1 个答案:

答案 0 :(得分:1)

对于每个文档中不那么大量的会议,如果要获取确切的文档,则可以执行此管道,很简单:

db.collection.aggregate(
    [
       {
            $match: {
              id:"5c1b0616a0441f27f022bfdc"             
            }
        },          {
            $unwind: {
                path : "$meetings"
            }
        },
        {
            $unwind: {
                path : "$meetings.participants"
            }
        },
        {
            $match: {
              "meetings.id":"5c1b073d445707834699ce97",
              "meetings.participants.nomina":1

            }
        },
        {
            $replaceRoot: {
                newRoot: "$meetings.participants"
            }
        }
    ]);

如果会议中有成千上万的元素,那么我建议您为会议添加另一个匹配项或将会议和项目ID分组。 但是,如果您只想获取包含所需内容的文档,那只是一个简单的查找查询:

db.collection.find({id:"5c1b0616a0441f27f022bfdc","meetings.id":"5c1b073d445707834699ce97","meetings.participants.nomina":1 });