2015-04-26 4 views
5

У меня есть этот документ в MongoDB:MongoDB - группа составной ключ с вложенными полями

{ 
"_id":"26/04/2015 09:50", 
"reservations":130, 
"Event_types":[ 
    { 
    "type":"Party", 
    "events":[ 
     { 
      "eventName":"After Party", 
      "total_count":130, 
      "by":[ 
       { 
       "siteName":"club8", 
       "countArray":[ 
        { 
         "bucket":"default", 
         "value":40 
        } 
       ] 
       }, 
       { 
       "siteName":"PostParty", 
       "countArray":[ 
        { 
         "bucket":"1", 
         "value":70 
        }, 
        { 
         "bucket":"2", 
         "value":20 
        } 
       ] 
       } 
      ] 
     } 
     ] 
    } 
] 
} 

Что я ищу

Я хочу подвести поле «значение» и группу по этим поля:

  1. типа
  2. именем_события
  3. Имя_узла

Таким образом, для документа, у меня есть, я бы ожидать, чтобы получить:

  1. Для комбинации { "партии", "After Party", "club8"} а сумма 40
  2. Для комбинации { "партии", "After Party", "PostParty"} сумма 90

То, что я пытался

Я попытался с помощью совокупного оператора с составным ключом для _id:

db.testing.aggregate(
{ 
$group : { 
    _id : 
    { 
    type:'$Event_types.type', 
    name: '$Event_types.events.eventName', 
    siteName: '$Event_types.events.by.siteName' 
    } 
    , total : { $sum : '$Event_types.events.by.countArray.value' } 
} 
}); 

Результаты

один документ, с 3-х массивов - по одному для каждого значения я хочу группе. Массив «siteName» содержит 2 значения, доступные для «siteName». «Сумма», кажется, ничего не суммирует, и она появляется только один раз - я ожидал увидеть ее рядом с каждым значением «SiteName» в документе.

{ 
    "_id":{ 
     "type":[ 
     "Party" 
     ], 
     "name":[ 
     [ 
      "After Party" 
     ] 
     ], 
     "siteName":[ 
     [ 
      [ 
       "club8", 
       "PostParty" 
      ] 
     ] 
     ] 
    }, 
    "total":0 
} 

я использую «заполнитель» неправильный путь или схема я использую не подходит для моей цели? Спасибо.

ответ

6

Необходимо сначала применить оператор $unwind на всех массивах, чтобы вы могли выполнять вычисления агрегации с помощью оператора $group позже на этапах трубопровода. В конце концов вы будете в конечном итоге с конвейера агрегации, как это:

db.testing.aggregate([ 
    { "$unwind": "$Event_types" }, 
    { "$unwind": "$Event_types.events" }, 
    { "$unwind": "$Event_types.events.by" }, 
    { "$unwind": "$Event_types.events.by.countArray" }, 
    { 
     "$group": { 
      "_id": { 
       "type": "$Event_types.type", 
       "name": "$Event_types.events.eventName", 
       "siteName": "$Event_types.events.by.siteName" 
      }, 
      "total": { 
       "$sum": "$Event_types.events.by.countArray.value" 
      } 
     } 
    }, 
    { 
     "$project": { 
      "_id": 0, 
      "type": "$_id.type", 
      "name": "$_id.name", 
      "siteName": "$_id.siteName", 
      "total": 1 
     } 
    } 
]); 

Выход

/* 1 */ 
{ 
    "result" : [ 
     { 
      "total" : 90, 
      "type" : "Party", 
      "name" : "After Party", 
      "siteName" : "PostParty" 
     }, 
     { 
      "total" : 40, 
      "type" : "Party", 
      "name" : "After Party", 
      "siteName" : "club8" 
     } 
    ], 
    "ok" : 1 
} 
+1

Спасибо, это решает мою проблему! – assafm

+0

@assafm Не стоит беспокоиться :-) Рад помочь. – chridam

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