在MongoDB中检索n级深层子文档

sti*_*man 12 javascript mongodb

我在mongoDB中有一个深度嵌套的文档,我想获取单个子对象.

例:

{
   "schoolName": "Cool School",
   "principal": "Joe Banks",
   "rooms": [
      {
         "number": 100
         "teacher": "Alvin Melvin"
         "students": [
            {
               "name": "Bort"
               "currentGrade": "A"
            },
            // ... many more students
         ]
      },
      // ... many more rooms
   ]
}
Run Code Online (Sandbox Code Playgroud)

最近Mongo更新为允许使用$ elemMatch投影进行1级深度子对象检索:

var projection = { _id: 0, rooms: { $elemMatch: { number: 100 } } };
db.schools.find({"schoolName": "Cool School"}, projection);
// returns { "rooms": [ /* array containing only the matching room */ ]  }
Run Code Online (Sandbox Code Playgroud)

但当我尝试以同样的方式取一个学生(2级深)时,我收到一个错误:

var projection = { _id: 0, "rooms.students": { $elemMatch: { name: "Bort" } } };
db.schools.find({"schoolName": "Cool School"}, projection);
// "$err": "Cannot use $elemMatch projection on a nested field (currently unsupported).", "code": 16344
Run Code Online (Sandbox Code Playgroud)

有没有办法在mongoDB文档中检索任意深的子对象?

我正在使用Mongo 2.2.1

Pab*_*ook 0

我目前手边没有 mongodb 2.2,所以我无法测试这个,但是你尝试过吗?

var projection = { _id: 0, rooms: { $elemMatch: { "students.name": "Bort" } } };
db.schools.find({"schoolName": "Cool School"}, projection);
Run Code Online (Sandbox Code Playgroud)

  • 是的,听起来好像还不支持。https://github.com/mongodb/mongo/blob/master/src/mongo/db/projection.cpp#L73(非常讨厌`! mongoutils::str::contains( e.fieldName(), '.' ) `) (2认同)