Получение определенного внедренного документа из запроса MongoDB - PullRequest
3 голосов
/ 09 марта 2012

У меня есть документ 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") 
}

Мне нужно извлечь конкретный внедренный документ «1» в «snapshotDetails», например:

«1»: {"id": 2," name ":" jatin "," type ":" justus "," width ": 100," height ": 100," position ": 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 ]

1 голос
/ 28 января 2015

Это поздний ответ, но я думаю, что он будет полезен для других.Предположим, что 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

1 голос
/ 09 марта 2012

Я думаю, что ваша проблема в том, что он возвращает полное содержание поддокумента «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 
}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...