2017-05-13 3 views
0

Ich führe ein Aggregat durch und schaue mir an, wie man innerhalb der ursprünglichen Aggregatmethode die Fähigkeit, die SUM Gesamtsumme weiter zu zerlegen, durchführt. Momentan gebe ich Gesamtereignisse innerhalb einer Entfernung zurück, gruppiert nach Cluster-Code. Ich möchte die Gesamtzählung mit jeder Kategorie aufgeteilt haben.Zählvariable innerhalb zurückgegebener aggregierter Ergebnisse

Ich weiß, ich kann so

var events = Events.aggregate(
     [ 
      { 
      $match : { 
       "location.loc" : { 
        $geoWithin : { 
        $centerSphere : [[long,lat], milesToRadian(radius) ] 
        } 
       } 
      } 
      }, 
      { 
      $group : { 
       _id : { 'cluster_code' : "$location.cluster_code"}, 
       count : { $sum : 1 } 
      } 
      } 
     ] 
    ) 

eine $group Abfrage durchführen Ich bin bewusst, dass ich einen zusätzlichen Parameter {"category" : "$category"} in meiner $group Abfrage hinzufügen kann dies für jede Kategorie zu brechen. Ich kann dann eine Gruppierungsmethode ausführen, um das richtige Format zu erstellen, nach dem ich suche. Das fühlt sich an, als könnte ich die Abfrage verbessern.

Was ich versuche zu erreichen ist eine SUM Zählung dann eine Zählung für jede category. Ähnliches:

{ 
    "_id": { 
     "cluster_code": "FK", 
    }, 
    "Run" : 2, 
    "Swim" : 1 
    "count": 3 
    }, 

Ist dies in einer einzigen Aggregatabfrage möglich?

UPDATE

Beispiel Dummy Dokument

{ 
_id : "df", 
"location" : { 
    //... 
}, 
"category" : "Run" 
} 
+0

Wie sieht Ihr Beispieldokument aus? – Astro

+0

Aktualisiert oben. 'category' ist eine Top-Level-Zeichenfolge – Allreadyhome

Antwort

0

Sie unter Aggregation Pipeline in 3.4.4 Version versuchen.

$group von cluster_code und category, um die Anzahl für jede Gruppierung zu erhalten.

$zip jeweils category Schlüsselwertpaar getrennt gefolgt von $arrayToObject, um Ausgabeformatstruktur zu erstellen.

Verwenden $addFields die cluster_code & total in data zu schieben.

Verwenden Sie $replaceRoot, um das eingebettete Dokument data auf die oberste Ebene hochzustufen.

aggregate(
{$group : { 
     _id : { "cluster_code" : "$location.cluster_code", category:"$category"}, 
     count : { $sum : 1 } 
    } 
}, 
{$group : { 
     _id : "$_id.cluster_code", 
     categorycount : { $push:{category:"$_id.category", count:"$count" }}, 
     total:{$sum:"$count"} 
    } 
}, 
{$addFields:{data: {$arrayToObject:{$zip:{inputs:["$categorycount.category", "$categorycount.count"]}}}}}, 
{$addFields:{"data.cluster_code": "$_id", "data.total":"$total"}}, 
{$replaceRoot:{newRoot:"$data"}} 
) 
+0

2 Gruppen haben den Job gemacht und macht Sinn – Allreadyhome

Verwandte Themen