Wie aggregiere ich die Summe in MongoDB, um eine Gesamtzahl zu erhalten?

70

{ wins: Number }Wie kann ich bei einer Sammlung mit einem Feld das MongoDB Aggregation Framework verwenden , um die Gesamtzahl der Gewinne für alle Dokumente in einer Sammlung zu ermitteln?

Beispiel:

Wenn ich drei Dokumente mit wins: 5, wins: 8, wins: 12bzw., wie könnte ich MongoDB Aggregation - Framework verwenden , um die Gesamtzahl zurückzukehren, das heißt total: 25.

Sahat Yalkabov
quelle
Verwenden Sie eine $groupOperation wie in den Dokumenten gezeigt .
JohnnyHK
@ JohnnyHK Ich habe es versucht, db.characters.aggregate([{$group:{_id:'id',wins:{$sum:1}}}]);aber ohne Glück. Es gibt zurück, wie viele winsFelder ich anstelle der Werte aus den Gewinnen habe.
Sahat Yalkabov
10
db.characters.aggregate( [ { $group: { _id: null, total: { $sum: "$wins" } } } ] )
WiredPrairie
1
@WiredPrairie Danke, dass es funktioniert hat. Möchten Sie es als Antwort veröffentlichen, damit ich es akzeptieren kann?
Sahat Yalkabov

Antworten:

156

Summe

Um die Summe einer gruppierten Feld zu erhalten , wenn die Aggregation Rahmen MongoDB verwenden, müssen Sie verwenden $groupund $sum:

db.characters.aggregate([ { 
    $group: { 
        _id: null, 
        total: { 
            $sum: "$wins" 
        } 
    } 
} ] )

In diesem Fall müssen Sie, wenn Sie die Summe aller Daten erhalten möchten, winsauf den Feldnamen mit der $Syntax verweisen, bei der $winsnur die Werte des winsFelds aus den gruppierten Dokumenten abgerufen und summiert werden.

Anzahl

Sie können auch sumandere Werte verwenden, indem Sie einen bestimmten Wert übergeben (wie Sie es in Ihrem Kommentar getan haben). Wenn du hättest

{ "$sum" : 1 },

das wäre eigentlich eher eine Zählung aller winsals eine Summe.

WiredPrairie
quelle
Was würden Sie tun, wenn diese Abfrage lange dauert? (läuft über viele Dokumente)
Refaelos
3
Da dieser Algorithmus jedes Dokument scannen muss, müssen Sie die Ergebnisse zwischenspeichern, vorberechnen oder filtern, um den Gesamtaufwand zu reduzieren.
WiredPrairie
Wie kommt man zum Ergebnis? Ich bekomme einen Cursor zurück.
Chovy
1
Warum brauchst du das [ ]? Es funktioniert ohne sie, dh db.characters.aggregate({$group ... })statt db.characters.aggregate([{$group ... }]).
Foobarbecue
4
Wow, _id: null ist der Schlüssel hier. +1 Sie haben versucht, das Aggregationsframework zu verwenden, ohne darüber nachzudenken _id: null.
Pablo Burgos