鉴于下面的示例文档:
{
"_id" : "2",
"objects" : [{
"_id" : "1",
"name" : "embedded "
},{
"_id" : "2",
"name" : "embedded "
},{
"_id" : "3",
"name" : "embedded "
}],
"name" : "gloss2"
}
是否可以只返回一个子文档?这样我就不必选择整个父对象,获取列表,并循环遍历列表以获取相关对象。
{
"_id" : "2",
"name" : "embedded"
}
答案 0 :(得分:16)
是否可以只返回一个子文档?
是的,但不是你想要的方式。如果执行以下操作,则只会返回数组的第一个元素:
coll.find({_id:'2'}, { 'objects.0': 1})
然而,你真正想要的是如下所示:
coll.find({_id:'2', 'objects._id': '3'}, { 'objects.$' : 1})
当然,这在MongoDB中实际上不起作用。
查看your other question,这是使用“嵌入对象”而不是“对象数组”的原因之一。使用“嵌入对象”,您可以执行以下操作:
coll.find({_id:'2'}, {'objects.3': 1}) // where 3 is the id of the third object
这使您可以选择所需的“嵌入对象”。
这样我就不必选择整个父对象......
MongoDB的问题是父文档总是获取。查询返回顶级文档。这是整个架构的结晶。即使您只请求文档的一部分,服务器仍然必须将整个文档加载到内存中,然后才能为您提供所需的文件。
解决这个问题的唯一方法可能是新的Aggregation Framework,但这还不在稳定的分支中。
答案 1 :(得分:2)
您可以返回一个子文档,但不能从数组中返回一个元素。遗憾。
答案 2 :(得分:2)
你可以用mongo>来做到这一点2.2版本。
db.collection.find({'objects._id':1},{'objects。$':true})
但是你得到了第一个匹配元素 http://docs.mongodb.org/manual/reference/projection/positional/
答案 3 :(得分:0)
在最新版本的mongodb(现为2.6)中,有一个投影$elemMatch
,在这种情况下可以帮助我们。
如果它对某人有帮助,则此页面中有一些示例:http://docs.mongodb.org/manual/reference/operator/projection/elemMatch/#proj._S_elemMatch
答案 4 :(得分:0)
Mongodb 3.2引入了$ elemMatch,你只能从文档数组中获得一个第一个匹配的文档。
db.sample.find({_id:"2"},{objects:{$elemMatch:{_id:"2"}}})