2016-01-09 6 views
0

У меня есть миллионы записей, как это:MongoDB Aggreation Multiple Группа

{ 
    "_id" : ObjectId("568adba57faad8f22ff38a07"), 
    "temperature" : 27, 
    "elapsedTime" : 27, 
    "stationId" : 28, 
    "beaconId" : 238, 
    "beaconClass" : 1, 
    "batteryLevel" : 61 
} 

Я хочу, чтобы сгруппировать мои записи, как это:

{"stationId":1, "beaconClass":1, total_time: summary_of_elapsedTime_in_station_for_this_beaconClass} 
{"stationId":1, "beaconClass":2, total_time: summary_of_elapsedTime_in_station_for_this_beaconClass} 
... 
... 
{"stationId":2, "beaconClass":1, total_time: summary_of_elapsedTime_in_station_for_this_beaconClass} 
{"stationId":2, "beaconClass":2, total_time: summary_of_elapsedTime_in_station_for_this_beaconClass} 
{"stationId":2, "beaconClass":3, total_time: summary_of_elapsedTime_in_station_for_this_beaconClass} 
... 
... 
// so on 

я могу группировать по stationId или beaconId или класса. Но когда я пытаюсь сгруппировать по нескольким столбцам, получившим ошибку.

Как я могу создать запрос агрегации для этого?

+0

Возможный дубликат [группы MongoDB с несколькими id] (http://stackoverflow.com/questions/24035627/mongodb-group-with-multiple-id) – styvane

ответ

2

Для группировки по нескольким полям необходимо указать агрегированный ключ для значения _id. Взгляните на группу $ documentation.

Попробуйте следующий запрос:

db.collection.aggregate([ 
    { 
    $group: { 
     _id: {stationId: "$stationId", beaconClass: "$beaconClass"}, 
     elapsedTime: {$sum: "$elapsedTime"} 
    } 
    } 
]) 

Если вам нужно проецировать полученные поля в другой схеме вы можете воспользоваться $project оператора в агрегации:

{ 
    $project: { _id: 0, stationId: "$_id.stationId", beaconClass: "$_id.beaconClass", elapsedTime: 1 } 
} 
+0

Он работает! Я не могу поверить, как все так просто. Спасибо. – fatiherdem

+0

И, пожалуйста, вы можете дать мне некоторое объяснение, почему мы не использовали несколько ключей '$ group'? Как он может справиться так легко? – fatiherdem

+0

Не начинайте свой ответ с * Попробуйте следующий запрос * Вместо этого попробуйте объяснить, что делает ваш запрос и почему он работает. Также вам не нужен этап $ project, потому что это приведет к снижению производительности. – styvane

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