2017-02-15 5 views
2

У меня есть документы, которые являются группы товаров, например:

[ 
    { 
    options: [], 
    products: [ 
     { 
     sku: '123', 
     name: 'Product name 1' 
     }, { 
     sku: '476', 
     name: 'Product name 2' 
     } 
    ] 
    }, { 
    options: [], 
    products: [ 
     { 
     sku: '265', 
     name: 'Product name 3' 
     }, { 
     sku: '789', 
     name: 'Product name 4' 
     } 
    ] 
    } 
] 

Что мне нужно сделать, это расширенный запрос, который включает в себя сортировку не только группы товаров, но и массивы продукции внутри.

Метод, который я пытаюсь в настоящее время является использование aggregate() с $unwind и $sort, а затем попытаться поставить группу вместе (после того, как $unwind нарушил products массив из).

Products.aggregate([ 
    { $unwind: '$products' }, 
    { $sort: { 
    'products.sku': -1 
    } }, 
    { $group: { 
    '_id': '$_id', 
    something: { $push: '$$ROOT' } 
    } } 
]).exec() 

Это, очевидно, $group, это не так. Я использую '_id': '$_id' поставить оригинальный MongoDB _id назад, но я не знаю, как сказать:

«группа группового идентификатора продукта, и включают в себя все оригинальные поля»

Так на самом деле я пытаясь $unwind и $sort массив продуктов, то я хочу $wind_it_back_up_again ... :-)

Как я могу достичь этого ..?

Обновление: Этот вопрос касается сохранения всех полей при группировке.

+0

Возможный дубликат [MongoDB рода внутренний массив] (http://stackoverflow.com/questions/15388127/mongodb-sort-inner-array) – Veeram

+1

@Veeram Я думаю, что это вопрос не только о сортировке внутренний массив, но также и о сохранении всех полей при группировке, так что это разные –

+1

Хорошо. Чтобы сохранить поля, вы можете попробовать что-то вроде этого. '{$ group: {_id: '$ _id', options: {'$ first:' $ options '},' products ': {$ push:' $ products '}}}' и сохраняем как одно и то же. – Veeram

ответ

1

Возможно, я ошибаюсь, но, как я знаю, нет возможности сохранять все поля при группировке, вы должны вручную определить все свойства. Это код, который вы ищете, он сортирует группы продуктов с помощью ключа «products.sku», сортирует внутренний массив «products» с помощью ключа «sku» и сохраняет все поля в течение этапов $ group и $ project.

db.test.aggregate([ 
    {$unwind: "$products"}, 
    {$sort: {"products.sku": -1}}, 
    {$group: { 
     _id: {_id: "$_id", options: "$options"}, products: {$push: "$products"} 
    }}, 
    {$project: { 
     _id: "$_id._id", 
     options: "$_id.options", 
     products: "$products" 
    }}, 
    {$sort: {"products.sku": -1}} 
]).pretty(); 
+0

Спасибо, это действительно работает. Это означает, что если я изменю схему «Продукты», чтобы добавить больше полей на корневом уровне (рядом с «опциями» и «продуктами»), я также должен помнить об обновлении этого 'aggregate()', который является боль. –

+0

Да, вы должны четко определить все поля на этапе группировки. Меня тоже интересует этот вопрос, поэтому я продолжу исследования –