2015-05-20 3 views
0

Я использую MongoDb для хранения следующих JSON. Как найти все статьи с помощью «2d641b7c-3d74-4cfa-8267-d5a01ed2614b» в массиве pageLayouts.mongodb: запрос в глубоких массивах

{ 
    "magazine": { 
     "articles": [ 
      { 
       "articleLayouts": [ 
        { 
         "pageLayouts": [ 
          "2d641b7c-3d74-4cfa-8267-d5a01ed2614b" 
         ] 
        } 
       ] 
      } 
     ] 
    } 
} 

В документации MongoDb указывается только поиск элементов в массиве, которые имеют только 1 уровень глубины. Например: Поиск в «http://docs.mongodb.org/manual/reference/bios-example-collection/»

db.bios.find(
    { 
     awards: { 
       $elemMatch: { 
        award: "Turing Award", 
        year: { $gt: 1980 } 
       } 
     } 
    } 
) 

Как искать более глубокие массивы? как в массиве статей в первом JSON?

ответ

1

Оператор $elemMatch соответствует документам, которые содержат поле массива, по меньшей мере, с одним элементом, который соответствует всем указанным критериям запроса.

и запросов, как:

db.collectionName.find({"magazine.articles":{"$elemMatch":{"articleLayouts":{"$elemMatch":{"pageLayouts":{"$in":["2d641b7c-3d74-4cfa-8267-d5a01ed2614b"]}}}}}}).pretty() 
+0

СПАСИБО! Это то, что мне нужно. – riship89

0

Вы можете использовать aggregation framework для этого, в частности, $unwind оператора, как это деконструирует поле массива из входных документов для вывода документа для каждого элемента. Каждый выходной документ заменяет массив значением элемента. Таким образом, вы можете выполнить запрос $ match дальше по конвейеру для фильтрации документов и возврата тех, которые соответствуют вашим критериям.

Следующая трубопровод агрегация будет возвращать документы с "2d641b7c-3d74-4cfa-8267-d5a01ed2614b" в массиве pageLayouts:

var pipeline = [ 
    { 
     "$match": { 
      "magazine.articles.articleLayouts.pageLayouts": "2d641b7c-3d74-4cfa-8267-d5a01ed2614b" 
     } 
    }, 
    { 
     "$unwind": "$articles" 
    }, 
    { 
     "$unwind": "$articles.articleLayouts" 
    }, 
    { 
     "$unwind": "$articles.articleLayouts.pageLayouts" 
    }, 
    { 
     "$match": { 
      "magazine.articles.articleLayouts.pageLayouts": "2d641b7c-3d74-4cfa-8267-d5a01ed2614b" 
     } 
    } 
]; 

db.collection.aggregate(pipeline); 
Смежные вопросы