【发布时间】:2014-05-23 23:17:38
【问题描述】:
我很难理解重叠投影在 mongodb 中的工作原理。
这里有一个简单的例子来说明我的难题(in-browser mongodb console 的结果)。
首先,我创建并插入了一个简单的文档:
var doc = {
id:"universe",
systems: {
1: {
name:"milky_way",
coords:{x:1, y:1}
}
}
}
db.test.insert(doc);
// doc succesfully inserted
接下来,我尝试了一个有点奇怪的投影:
db.test.find({}, {"systems.1.coords":1, "systems.1":1});
//result
"_id" : ObjectId("537fd3541cdcaf1ba735becb"),
"systems" : {
"1" : {
"coords" : {
"y" : 1,
"x" : 1
}
}
}
}
我希望看到整个“系统 1”,包括名称字段。但似乎“systems.1.coords”的更深层路径覆盖了“system.1”的更浅路径?
我决定测试一下这个“深路径压倒浅路径”的理论:
db.test.find({}, {"systems.1.coords.x":1, "systems.1.coords":1});
//result
"_id" : ObjectId("537fd3541cdcaf1ba735becb"),
"systems" : {
"1" : {
"coords" : {
"y" : 1, // how'd this get here, but for the shallower projection?
"x" : 1
}
}
}
}
在这里,我的深层投影没有覆盖较浅的投影。
什么给了? mongodb如何处理重叠投影?我找不到它的逻辑。
编辑:
我的困惑源于所谓的“顶级”路径。
这正如我预期的那样工作:.findOne({}, {"systems.1":1, "systems":1})(即返回一整套系统,尽管我从看起来“更窄”的投影开始)。
但是,这并没有像我预期的那样工作:.findOne({}, {"systems.1.name":1, "systems.1":1})(即只返回 system.1 的名称字段)。
简而言之,超过“一个点”的深度会导致已接受答案中讨论的覆盖。
【问题讨论】:
标签: mongodb projection aggregation-framework