Mongodb选择字段返回数组中的嵌入文档

时间:2012-02-08 21:30:16

标签: mongodb

鉴于下面的示例文档:

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

是否可以只返回一个子文档?这样我就不必选择整个父对象,获取列表,并循环遍历列表以获取相关对象。

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

5 个答案:

答案 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"}}})