2014-10-25 4 views
0

У меня есть коллекция с документами, как этиСортировка массива документов в агрегации MongoDB

{ 
    "Day" : 1 
    "Name" : "Fred", 
    "Badges" : ["STAR", "FAST"] 
} 

{ 
    "Day" : 2 
    "Name" : "Fred", 
    "Badges" : ["STAR", "NEWBIE", "SLOW"] 
} 

{ 
    "Day" : 3 
    "Name" : "Fred", 
    "Badges" : ["STAR", "NEWBIE", "FAST"] 
} 


{ 
    "Day" : 1 
    "Name" : "Frank", 
    "Badges" : ["STAR","GO"] 
} 

{ 
    "Day" : 2 
    "Name" : "Frank", 
    "Badges" : ["STAR"] 
} 

Я агрегировать эти документы на весь месяц, чтобы вернуть статистику, как этот

{ 
    Name : "Fred" 
    Badges : [{Name : "STAR", Count : 3}, 
      {Name : "NEWBIE", Count : 2}, 
      {Name : "FAST", Count : 2}, 
      {Name : "SLOW", Count : 1} 
      ] 
} 

а такой же предмет для Frank.

{ 
    Name : "Fred" 
    Badges : [{Name : "STAR", Count : 2}, 
      {Name : "GO", Count : 1} 
      ] 
} 

У меня возникли проблемы с видом. Как я могу заказать значение значка STAR? Могу ли я изменить запрос агрегации для получения другого результата?

Я считаю, что структура, как это может быть хорошим решением, но я не понимаю, как получить его

{Name : "Fred" 
    STAR : 2 
    GO : 1} 

Благодарности

+0

Используйте команду $ unwind для итерации элементов массива «Значки». Затем вы можете сделать $ project для извлечения отсчетов по каждому значению значка, а затем отсортировать его в поле 'STAR'. – cubbuk

ответ

1
db.a.aggregate([ 
{$unwind: "$Badges"}, 
{$group: {_id: {name: "$Name", badge: "$Badges"}, numberOfBadges: { $sum: 1}}}, 
{$project: {_id: 0,name: "$_id.name", badge: "$_id.badge", numberOfBadges:1, orderField: {$cond: [{$eq: ["$_id.badge", "STAR"]}, "$numberOfBadges", 0]}}}, 
{$sort: {orderField:-1}}]) 

Насколько я знаю, вы не можете иметь динамическое поле имена в структуре агрегации, поэтому вы не можете иметь имя поля как STAR. Но вы можете сделать трюк, добавив новое поле в свой документ, например orderField, и установите для него номер numberOfBadges, если значок равен STAR, в противном случае установите 0 в это поле. Затем сортируйте по orderField.

+1

Спасибо cubbuk :) – MetalMad

+0

Добро пожаловать =) – cubbuk

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