2014-11-03 5 views
0

Я пытаюсь использовать структуру агрегации для суммирования вложенного массива с вложенным массивом и возврата исходного документа в отсортированном порядке.MongoDB Получить общее количество вложенных массивов в массиве документа

Так вот, что мой документ выглядит следующим образом:

myColl: { 
_id: 123, 
fruits: [{ 
    name: apple, 
    buyers: [{buyer1}, {buyer2}] 
    }, 
    { 
    name: banana, 
    buyers: [{buyer1}, {buyer2}, {buyer3}] 
] 
} 

Как вы можете плоды массив поддокументов внутри myColl документа, и покупатели это руга массив поддокументов внутри плодов.

Я хочу, чтобы подсчитать количество покупателей в документе для всех фруктов. Таким образом, в вышеупомянутом документе должны быть покупатели «5».

Затем я хочу отсортировать все документы в myColl у всех покупателей. Я попробовал несколько вещей, и я не могу показаться, чтобы получить это право:

db.myColl.aggregate([ 
{$unwind: '$fruits'}, 
{$unwind: '$fruits.buyers'}, 
     {$group: { 
      _id: '$fruits.buyers', 
      totalBuyers: {$sum: '1'}, 
         docs: {$push: '$$ROOT'} 
     }}, 
     {$sort: {'totalBuyers': 1}}]) 

не дает мне желаемого результата и totalBuyers всегда равен 0. Кроме того, он возвращает мне больше результатов, то общее кол myColl , Я предполагаю, что это как-то связано с полем «_id».

Я рассмотрел некоторые другие вопросы и не смог найти что-то, что соответствует или работает в моем случае.

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

ответ

0

Да, после того, как много лужения и возни у меня было два вопроса:

1) Я имел кавычки мой номер, глупая ошибка. 2) Мне нужно в явной группе по $$ ROOT._id

Так вот решение, которое работает:

db.myColl.aggregrate(
[ 
     {$unwind: '$fruits'}, 
     {$unwind: '$fruits.buyers'}, 
     {$group: { 
      _id: '$$ROOT._id', 
         doc: {$first: '$$ROOT'}, 
      totalBuyers: {$sum: 1} 
     }}, 
     {$sort: {'totalBuyers': -1}}, 
       {$limit : 10 } 
    ] 
) 

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

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