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

Fre*_*k L 7 mongodb

鉴于下面的示例文档:

{
  "_id" : "2",
  "objects" : [{
      "_id" : "1",
      "name" : "embedded "
    },{
      "_id" : "2",
      "name" : "embedded "
    },{
      "_id" : "3",
      "name" : "embedded "
    }],
  "name" : "gloss2"
}
Run Code Online (Sandbox Code Playgroud)

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

{
    "_id" : "2",
    "name" : "embedded"
}
Run Code Online (Sandbox Code Playgroud)

Gat*_* VP 16

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

是的,但不是你想要的方式.如果执行以下操作,则只会返回数组的第一个元素:

coll.find({_id:'2'}, { 'objects.0': 1})
Run Code Online (Sandbox Code Playgroud)

但是,您真正想要的是如下所示:

coll.find({_id:'2', 'objects._id': '3'}, { 'objects.$' : 1})
Run Code Online (Sandbox Code Playgroud)

当然,这在MongoDB中实际上不起作用.

看看你的另一个问题,这是使用"嵌入对象"而不是"对象数组"的原因之一.使用"嵌入对象",您可以执行以下操作:

coll.find({_id:'2'}, {'objects.3': 1}) // where 3 is the id of the third object
Run Code Online (Sandbox Code Playgroud)

这使您可以只选择所需的"嵌入对象".

这样我就不必选择整个父对象......

MongoDB的用处是始终提取父文档.查询返回顶级文档.这是整个架构的结晶.即使您只请求文档的一部分,服务器仍然必须将整个文档加载到内存中,然后才能为您提供所请求的文件.

解决这个问题的唯一方法可能是新的聚合框架,但这还不在稳定的分支中.