2012-03-09 4 views
3

У меня есть документ MongoDB структурированный, какПолучение конкретного внедренный документа из MongoDB Query

{ 
    "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 «: { "идентификатор": 2, "название": "Jatin", "типа": "Иустом", "ширина": 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 
    } 
] 

Можно ли определить проблему с этим запросом и предложить, как только вернуть вложенный документ, я хочу?

ответ

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 
}}} 
+0

нет я не получаю суб-документ –

+0

нашел проблему, редактирует выше –

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

Смежные вопросы