2016-05-23 6 views
2

Ich habe folgende Daten:Mongo: Wie Aggregationsgruppen über Java MongoTemplate zählen

{groupId: 1, name: Jon}, 
{groupId: 1, name: Dan}, 
{groupId: 2, name: Jon}, 
{groupId: 2, name: Ris}, 
{groupId: 3, name: David} 

Ich erhalte als Eingabe eine Reihe von groupID ist, und ich möchte für diejenigen, die Menge an Distict Namen insgesamt zählen Gruppen, definiert ich den Code-Aggregation wie folgt:

groupIds [] = {1,2} 

    Aggregation agg = newAggregation(
      match(Criteria.where("groupId").in((groupIds)), 
      group("name").count().as("total") 
    ); 

aber ich bekomme eine groupResult eine Zählung für jeden Namen enthalten, dh:

{name : Jon, total : 2} 
{name : Dan, total : 1} 
{name: Ris, total : 1} 

während ich will eigentlich die Gesamtzahl erhalten, die ist = (die eigentlich die Größe der oben groupResult ist)

wie muss ich meine Aggregation einstellen, dass zu erreichen?

Danke!

p.s. David wird von der Zählung ignoriert - wie beabsichtigt

Antwort

1

Um die Größe der letzten Gruppe erhalten Sie eine weitere letzte $group Pipelinestufe einführen können, wo Sie eine null Gruppe von Schlüsseln zur Gruppe all Dokumente und dann verwenden können, berechnen die akkumulierte Summe.

In Mongo Shell, dies zu

db.collection.aggregate([ 
    { "$match": { "groupId": { "$in": [1, 2] } } }, 
    { 
     "$group": { 
      "_id": "$name"    
     } 
    }, 
    { 
     "$group": { 
      "_id": null, 
      "total": { "$sum": 1 } 
     } 
    } 
]) 

mit Spring Data übersetzen würde, sollte dies wie folgt vor:

Aggregation agg = newAggregation(
    match(Criteria.where("groupId").in((groupIds)), 
    group("name"), 
    group().count().as("total") 
); 
+0

, die genau das, was war ich brauchte! Vielen Dank! – shemerk