在嵌套对象的数组字段中通过id查找子文档

cba*_*los 4 mongodb mongodb-query

如果我有这样的文件:

{
   "_id": ObjectId("54e6774a73a7edfefdb9e2bc"),
   "information":"",
   "__v":0,
   "goalieRoster":{
      "locked":[

      ],
      "approved":[
         {
            "_id": ObjectId("548d49bad972605bf2d1f55a"), // find by this
         }
      ],
      "signedUp":[
         {
            "_id": ObjectId("548d49bad972605bf2d1f55a"),
         }
      ],
      "maxSize":2
   },
   "skaterRoster":{
      "locked":[

      ],
      "approved":[

      ],
      "signedUp":[

      ],
      "maxSize":26
   },
   "date":{
      "updated":"2015-02-20T02:56:42.258Z",
      "skate":""
   }
}
Run Code Online (Sandbox Code Playgroud)

我如何approved通过子文档的id 获取整个子文档?我认为我很接近,因为以下查询几乎可以满足我的需求.

db.roster.find(
        {
            "goalieRoster.approved._id": ObjectId("548d54e9576ddacc20f3a88e")
        },
        {
            "goalieRoster.approved": 1
        }
);
Run Code Online (Sandbox Code Playgroud)

它返回父文档和approved嵌套在里面的数组内的匹配子文档,goalieRoster如此

{
    "_id" : ObjectId("54e6774a73a7edfefdb9e2bc"),
    "goalieRoster" : {
        "approved" : [
            {
                "_id" : ObjectId("548d54e9576ddacc20f3a88e"),
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我想要的只是里面的子文档approved.此外,有能够丢弃goalieRoster,只是approved,并将它看起来既在经批准的数组中goalieRosterskaterRoster

编辑:我正在寻找的结果就是这个

{
    "_id" : ObjectId("548d54e9576ddacc20f3a88e"),
}
Run Code Online (Sandbox Code Playgroud)

sty*_*ane 12

您想要的是与$操作员一起投影.

db.test.find({"goalieRoster.approved._id": ObjectId("548d49bad972605bf2d1f55a")},
    {"goalieRoster.approved.$": true}
)
Run Code Online (Sandbox Code Playgroud)

结果

{
    "_id" : "54e6774a73a7edfefdb9e2bc", 
    "goalieRoster" : { "approved" : [ { "_id" : "548d54e9576ddacc20f3a88e" } ] }
}
Run Code Online (Sandbox Code Playgroud)