Mongodb获得文档的特定部分

时间:2011-03-14 17:00:12

标签: mongodb

我正在尝试使用mongo db,我想询问是否可能只获取文档的特定部分?

示例

{
   "name" : "MongoDB",
   "info" : {
               x : 203,
               y : 102
             }
}

我只想要info的内容。

我发现的最近的是db.cellection.find({},{info:1 }),但这会返回信息:内容,我想返回内容。

有可能吗?怎么样?

6 个答案:

答案 0 :(得分:28)

你可以做到

db.collection.find({},{'info.x':1, 'info.y':1})

但这意味着在投影中列出信息对象的每个项目 - 这可能是也可能不是您正在寻找的内容。

答案 1 :(得分:13)

您可以使用类似于以下内容的distinct()函数:

db.collection.distinct("info", {info : {$exists : true}})

答案 2 :(得分:11)

不,你不能只返回x / y的值;即使您限制了字段,外部结构仍然会被返回。

有关详细信息,请参阅Result Projections

答案 3 :(得分:1)

MongoDb docs

阅读本文

在此,如果未指定投影,则find()方法将返回与查询匹配的所有文档的所有字段。

答案 4 :(得分:0)

您可以使用aggregation framework

  1. $ match phase(可选)以过滤结果。
  2. $ project阶段选择字段

    db.getCollection('yourCollection').aggregate([ {$match:{_id:ObjectId("566fc97f5b79dff1a73ca2ae")}}, {$project:{_id:0, "x":"$info.x", "y":"$info.y"}} ])

答案 5 :(得分:0)

  • Mongo 4.2开始,$replaceWith聚合运算符可用于将一个文档替换为另一个文档(在本例中为子文档):

    // { name: "MongoDB", info: { x: 203, y: 102 } }
    db.collection.aggregate({ $replaceWith: "$info" })
    // { "x" : 203, "y" : 102 }
    
  • Mongo 4.2之前并以Mongo 3.4开头的$replaceRoot可以代替$replaceWith

    db.collection.aggregate({ $replaceRoot: { newRoot: "$info" } })