2016-08-31 4 views
1

Имея следующий документ в моем Mongo, я пытаюсь получить объект с указанным id. Вот мой монгольский документ. версия Монго: 2,6Извлечь только запрошенный объект из вложенного массива в MongoDB

{ 
    "_id" : ObjectId("57c1ae9ac1bd31d4eb4d546d"), 
    "footers" : [ 
     { 
      "type" : "web", 
      "rows" : [ 
       { 
        "id" : "abc", 
        "elements" : [ 
         { 
          "id" : "def", 
          "type" : "image", 
          "url" : "http://example.com" 
         }, 
         { 
          "id" : "ghi", 
          "type" : "image", 
          "url" : "http://example.com" 
         } 
        ] 
       } 
      ] 
     } 
    ] 
} 

Я ищу объект с идентификатором «DEF», и я хочу, чтобы получить этот результат:

{ 
    "id" : "def", 
    "type" : "image", 
    "url" : "http://example.com" 
} 

Ниже я привожу пример кода, который я пытался для поиска этого объекта.

db.getCollection('myCollection').aggregate([ 
    {"$match": { 
     "footers.rows.elements.id": "def" 
    }}, 
    {"$group": { 
     "_id": "$footers.rows.elements" 
    }} 
]) 

И результат:

{ 
    "_id" : [ 
     [ 
      [ 
       { 
        "id" : "def", 
        "type" : "image", 
        "url" : "http://example.com" 
       }, 
       { 
        "id" : "ghi", 
        "type" : "image", 
        "url" : "http://example.com" 
       } 
      ] 
     ] 
    ] 
} 

Любые предложения?

ответ

2

Вам необходимо использовать «$unwind».

Этот ответ поможет вам более подробную информацию Mongodb unwind nested documents (https://stackoverflow.com/a/12241733/224743 определяет это должно работать в MongoDB 2.2+)

Для вашего конкретного примера, вы могли бы сделать что-то вроде:

db.getCollection('myCollection').aggregate([ 
    {"$match" : { "footers.rows.elements.id": "def" }}, 
    {"$unwind" : "$footers"}, 
    {"$unwind" : "$footers.rows"}, 
    {"$unwind" : "$footers.rows.elements"}, 
    {"$group" : { "_id": "$footers.rows.elements" }}, 
    {"$match" : { "_id.id": "def" }} 
]); 

Обратите внимание на множественным " $ unwind ", а также окончательный« $ match », который необходим для повторного применения условий для документов с разворотными документами.

+1

Большое спасибо. Очень полезно. –