如何在MongoDB中find嵌套在数组中的对象?

我是MongoDB的新手,并且在为我正在开发的一个新项目设置特定查询时遇到了一些困难。

我有一个像这样的数据结构(简化版本):

games: {_id: ..., scenes: [{_id: ..., views: [{_id: ...}]}]} 

(即游戏包含场景集合,场景包含视图集合)。

我想在这里查询的是一个特定的视图对象。 我想这个答案涉及到使用$ elemMatch,但我该如何设置? 经过一番研究+玩耍,我知道我可以做到这一点,以获得现场:

 db.collection("games").findOne({ _id: ObjectId(req.params.gid)}, { scenes: { $elemMatch: {_id: ObjectId(req.params.sid)} } }... 

但是,我怎样才能扩展它,使它只拉取我感兴趣的特定视图(通过_id)?

我想我总是可以find我正在寻找手动使用for循环的视图对象,这带来了另一个问题。 Wrt的性能,更好的做这样的使用Mongo的查询,或通过拉动整个文档循环通过集合手动?

如果你的集合不大,而且这个操作比较less,那么用聚合框架就可以了。 但是,如果这个操作是频繁和性能的关键,那么我会说应用程序级别的查询。 无论如何,这就是你如何使用聚合和$unwind

所以,如果这是你的collections:

 > db.col.find().pretty() { "_id" : ObjectId("57e6a5404897ec06f1c3d86f"), "games" : [ { "_id" : "game1", "scenes" : [ { "_id" : "scene1", "views" : [ { "_id" : "view1" } ] } ] } ] } { "_id" : ObjectId("57e6a5d24897ec06f1c3d870"), "games" : [ { "_id" : "game1", "scenes" : [ { "_id" : "scene11", "views" : [ { "_id" : "view111" }, { "_id" : "view112" }, { "_id" : "view113" } ] }, { "_id" : "scene12", "views" : [ { "_id" : "view121" } ] } ] }, { "_id" : "game2", "scenes" : [ { "_id" : "scene21", "views" : [ { "_id" : "view211" } ] } ] } ] } 

假设你想findID为"view112"的视图,你可以这样做:

 db.col.aggregate([ { $unwind: "$games"}, { $unwind: "$games.scenes"}, { $unwind: "$games.scenes.views"}, { $match: { "games.scenes.views._id": "view112" } } ]) 

你会得到:

 { "_id": ObjectId("57e6a5d24897ec06f1c3d870"), "games": { "_id": "game1", "scenes": { "_id": "scene11", "views": { "_id": "view112" } } } } 

我不明白,你可以直接查询

 db.collection("games").findOne({"scenes.views._id":ObjectId(req.params.vid)},{_id:0,"scenes.$.views":1}); 

它应该删除场景中的其他场景(双关意图)。 但是,它仍然会为您提供多个视图,因为$只能在任何expression式中使用一次。 在那里,我认为循环是关键。

我会build议反对总量,他们是昂贵的。 至于要实现这个查询或获取文件,并通过它循环。 我肯定会通过查询来实现它,你获得的数据越lessperformance越好。