2016-12-12 1 views
0

Я пытаюсь преобразовать свои документы, как показано ниже. Я пробовал использовать оператор $unwind, затем оператор $group в сочетании с оператором $push, чтобы перестроить массив $user_mentions, но это также подталкивает все пустые массивы, и я снова вернусь к квадрату.Как сгладить вложенные массивы и удалить пустые массивы только в том случае, если они вложены с использованием структуры агрегации MongoDB?

Что я начинаю с:

{ 
    _id: "6222407", 
    name: "Chris", 
    user_mentions: [ 
    [], 
    [{_id:"963222", name: "Bob"}, {_id:"234324", name: "Fred"}] 
    ] 
}, 
{ 
    _id: "34566", 
    name: "Tim", 
    user_mentions: [ 
    [] 
    ] 
}, 
{ 
    _id: "65343", 
    name: "Sean", 
    user_mentions: [ 
    [], 
    [] 
    ] 
} 
} 

Что я хочу:

{ 
    _id: "6222407", 
    name: "Chris", 
    user_mentions: [ 
    {_id:"963222", name: "Bob"}, 
    {_id:"234324", name: "Fred"}] 
    ] 
}, 
{ 
    _id: "34566", 
    name: "Tim", 
    user_mentions: [ 

    ] 
}, 
{ 
    _id: "65343", 
    name: "Sean", 
    user_mentions: [ 

    ] 
} 

ответ

2

Из-за природы вашего макета документа вы должны дважды разматывать (массив в массиве). Также используйте preserveNullAndEmptyArrays во втором режиме, чтобы сохранить пустой массив в документах.

Вот агрегация:

db.collection.aggregate(
    [ 
    { 
     $unwind: "$user_mentions" 
    }, 
    { 
     $unwind: { path: "$user_mentions", preserveNullAndEmptyArrays: true } 
    }, 
    { 
     $group: { 
     _id : "$_id", 
     name : {$first : "$name"}, 
     user_mentions : { $push : "$user_mentions"} 
     } 
    } 
    ]  
); 
+0

Это выглядит, как будто это то, что я хочу. :) Я получаю 3.2, чтобы проверить эту вторую функциональность $ unwind. –

+0

Для чтения других: вам понадобится версия MongoDB 3.2. У меня возникли проблемы с тем, что 3.2 был правильно запущен на Ubuntu 14.04, но, к счастью, имел и ПК с ОС Windows. –

+1

Когда вы захотите его на предустановке 3.2 MongoDB, вы можете добавить этап проекта с помощью $ cond для создания пустого массива, если его нет. При необходимости я могу добавить пример ответа. – HoefMeistert