2014-11-24 3 views
0

Скажем, у меня есть коллекция объектов:MongoDB Aggregation трубопроводов, сочетающие глубоко вложенные объекты

{ 
    _id : 1, 
    list1 : [ 
     { name: 'This is my name', value: 'This is my value' }, 
     { name: 'name number 2', value: 'value number 2' } 
    ], 
    list2 : [ 
     { name: 'Another name', value: 'Another value' } 
    ], 
    deeper : { 
     list3 : [ 
     { name: 'Another name but even deeper', value: 'Another value but deeper' } 
     ] 
    } 
} 

Использование агрегирования трубопровода, как бы я вернуть единый список объектов имя/значение? Результат должен быть:

{ 
    _id : 1, 
    combinedList : [ 
     { name: 'This is my name', value: 'This is my value' }, 
     { name: 'name number 2', value: 'value number 2' }, 
     { name: 'Another name', value: 'Another value' }, 
     { name: 'Another name but even deeper', value: 'Another value but deeper' } 
    ] 
} 

ЧАСТЬ 2:

Теперь, как сглаживаются глубоко вложенные объекты из всей коллекции в один ответ? Пример:

{ 
    "_id" : 0, 
    list1 : [ 
     { name: 'This is my name', value: 'This is my value' }, 
     { name: 'name number 2', value: 'value number 2' } 
    ], 
    list2 : [ 
     { name: 'Another name', value: 'Another value' } 
    ] 
}, 
{ 
    "_id" : 1, 
    list1 : [ 
     { name: 'This is my name', value: 'This is my value' }, 
     { name: 'name number 2', value: 'value number 2' } 
    ], 
    deeper : { 
     list2 : [ 
     { name: 'Another name but even deeper', value: 'Another value but deeper' } 
     ] 
    } 
} 

Результат должен быть того же документа, что и выше (объединенный список).

ответ

1

вы можете использовать aggregate и setUnion

db.coll.aggregate([ 
    { 
     $match:{_id:1} 
    }, 
    { 
     $project: {_id: 0 , 
        combinedList: { $setUnion: [ "$deeper.list3","$list2", "$list1" ] }} 
    } 
    ] 
) 

результат

{ 
    "result" : [ 
     { 
      "combinedList" : [ 
       { 
        "name" : "Another name but even deeper", 
        "value" : "Another value but deeper" 
       }, 
       { 
        "name" : "Another name", 
        "value" : "Another value" 
       }, 
       { 
        "name" : "name number 2", 
        "value" : "value number 2" 
       }, 
       { 
        "name" : "This is my name", 
        "value" : "This is my value" 
       } 
      ] 
     } 
    ], 
    "ok" : 1 
} 

http://docs.mongodb.org/manual/reference/operator/aggregation/setUnion/

вы должны использовать версию 2.6.

+0

Спасибо @ Барно! Могу ли я пройти еще одно измерение? Что делать, если у меня есть список объектов, каждый со списком. Пример: { – JayJohnsonDesigns

+0

@JayJohnsonDesigns приветствуется. Можете ли вы написать пример? – Barno

+0

Я добавил пример к моему оригинальному вопросу. – JayJohnsonDesigns

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