从MongoDB查询中检索特定的嵌入文档

时间:2012-03-09 09:28:31

标签: mongodb

我有一个结构为

的MongoDB文档
{
   "id": 1,
   "userId": 1,
   "layout": 1,
   "snapshotDetails": {
     "0": {
       "id": 1,
       "name": "jaison",
       "type": "justus",
       "width": 100,
       "height": 100,
       "position": 1 
    },
     "1": {
       "id": 2,
       "name": "jatin",
       "type": "justus",
       "width": 100,
       "height": 100,
       "position": 2 
    } 
  },
   "_id": ObjectId("4f58932309ac38f808000002") 
}

我需要在“snapshotDetails”下提取特定的“1”嵌入文档,如下所示:

“1”:{        “id”:2,        “名字”:“jatin”,        “type”:“justus”,        “宽度”:100,        “身高”:100,        “位置”:2     }

为此,我构建了一个类似这样的查询:

db.MasterDashboard.find({
"userId" : 1,
"snapshotDetails.id" : 1
},
{
"snapshotDetails" : 1
});

但我没有得到正确的输出。查询的输出是

[
"0": {
       "id": 1,
       "name": "jaison",
       "type": "justus",
       "width": 100,
       "height": 100,
       "position": 1 
    },
     "1": {
       "id": 2,
       "name": "jatin",
       "type": "justus",
       "width": 100,
       "height": 100,
       "position": 2 
    }
] 

任何人都可以发现此查询的问题并建议如何只返回我想要的嵌入式文档吗?

2 个答案:

答案 0 :(得分:1)

我认为你的问题是它正在返回" snapshotDetails"的全部内容。子文档,这是您指定的投影所要求的。尝试更改您正在使用的投影。我从上面插入了您的示例文档然后运行:

db.foo.find({"userId" : 1, "snapshotDetails.0.id" : 1}, 
            { "_id" : 0, "snapshotDetails.1" : 1})

然后它应该只返回" 1"子文档,这是我得到的输出:

{ "snapshotDetails" : { "1" : 
                      { "id" : 2, 
                        "name" : "jatin", 
                        "type" : "justus", 
                        "width" : 100, 
                        "height" : 100, 
                         "position" : 2 
}}}

答案 1 :(得分:1)

这是一个迟到的答案,但我认为这对其他人有用。假设可以将snapshotDetails重写为正确的数组,如:

{
    "_id" : ObjectId("4f58932309ac38f808000002"),
    "id" : 1,
    "userId" : 1,
    "layout" : 1,
    "snapshotDetails" : [ 
        {
            "id" : 1,
            "name" : "jaison",
            "type" : "justus",
            "width" : 100,
            "height" : 100,
            "position" : 1
        }, 
        {
            "id" : 2,
            "name" : "jatin",
            "type" : "justus",
            "width" : 100,
            "height" : 100,
            "position" : 2
        }
    ]
}

聚合操作可以应用于以任何所需的方式对文档进行切片,过滤和重新格式化。例如,将doc视为容器集合,以下命令将产生所需的结果。

db.doc.aggregate([{$unwind:'$snapshotDetails'},{$project:{details:'$snapshotDetails' , _id:0}}, {$match:{'details.id':2}}])

结果:

{
    "result" : [ 
        {
            "details" : {
                "id" : 2,
                "name" : "jatin",
                "type" : "justus",
                "width" : 100,
                "height" : 100,
                "position" : 2
            }
        }
    ],
    "ok" : 1
}

MongoDB Aggregations

的更多信息