2012-02-08 77 views
7

返回嵌入文档给出下面的例子DOC:MongoDB的选择字段在阵列

{ 
    "_id" : "2", 
    "objects" : [{ 
     "_id" : "1", 
     "name" : "embedded " 
    },{ 
     "_id" : "2", 
     "name" : "embedded " 
    },{ 
     "_id" : "3", 
     "name" : "embedded " 
    }], 
    "name" : "gloss2" 
} 

是否有可能只返回一个子文档?这样我就不必选择整个父对象,获取列表,并遍历列表来获取有问题的对象。

{ 
    "_id" : "2", 
    "name" : "embedded" 
} 

回答

14

是否有可能只返回一个子文档?

是的,但不是你想要的样子。如果你做到以下几点,你将只能拿回数组的第一个元素:

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,但那还不是稳定的分支。

+0

太好了,谢谢你的解释。 – 2012-02-08 23:27:49

2

您可以返回一个子文档,但不能从数组中返回一个元素。抱歉。

0

Mongodb 3.2引入了$ elemMatch,你可以从文档数组中只获得一个第一个匹配的文档。

db.sample.find({_id:"2"},{objects:{$elemMatch:{_id:"2"}}})