MongoDB SELECT COUNT GROUP BY

179

Ich spiele mit MongoDB herum und versuche herauszufinden, wie man ein einfaches macht

SELECT province, COUNT(*) FROM contest GROUP BY province

Aber ich kann es nicht mit der Aggregatfunktion herausfinden. Ich kann es mit einer wirklich seltsamen Gruppensyntax machen

db.user.group({
    "key": {
        "province": true
    },
    "initial": {
        "count": 0
    },
    "reduce": function(obj, prev) {
        if (true != null) if (true instanceof Array) prev.count += true.length;
        else prev.count++;
    }
});

Aber gibt es eine einfachere / schnellere Möglichkeit, die Aggregatfunktion zu verwenden?

Steven
quelle

Antworten:

326

Dies wäre der einfachere Weg, um Folgendes zu tun aggregate:

db.contest.aggregate([
    {"$group" : {_id:"$province", count:{$sum:1}}}
])
Anand Jayabalan
quelle
1
Ich bekomme eine Fehlermeldung, wenn ich das versuche "errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",?
Steven
Wie gruppieren Sie die Sortierung? Ich möchte die Anzahl nach -1 sortieren
Filip Bartuzi
4
@FilipBartuzi gibt es ein Beispiel in der Dokumentationsseite, müssen Sie eine { $sort: { count: -1 } }
Sortieroperation
Ich habe die gleiche Ausnahme wie @Steven erhalten, weil ich nur Zeile 2 kopiert und die umgebenden eckigen Klammern weggelassen habe.
Peter Perháč
Bitte helfen Sie, wenn Sie für verwandte Fragen in mongoDB - stackoverflow.com/questions/61067856/…
newdeveloper
66

Ich benötige eine zusätzliche Operation basierend auf dem Ergebnis der Aggregatfunktion. Schließlich habe ich eine Lösung für die Aggregatfunktion und die Operation gefunden, die auf dem Ergebnis in MongoDB basiert. Ich habe eine Sammlung Requestmit Feld request, source, status, requestDate.

Einzelfeldgruppe nach & Anzahl:

db.Request.aggregate([
    {"$group" : {_id:"$source", count:{$sum:1}}}
])

Mehrere Felder gruppieren nach & Anzahl:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}}
])

Mehrere Felder gruppieren nach & Anzahl mit Sortieren nach Feld:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
    {$sort:{"_id.source":1}}
])

Mehrere Felder gruppieren nach & Anzahl mit Sortieren mit Anzahl:

db.Request.aggregate([
    {"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
    {$sort:{"count":-1}}
])
csharpbd
quelle
50

Wenn Sie mehrere Spalten zum Gruppieren benötigen, folgen Sie diesem Modell. Hier zähle ich durch statusund type:

  db.BusinessProcess.aggregate({
    "$group": {
        _id: {
            status: "$status",
            type: "$type"
        },
        count: {
            $sum: 1
        }
    }
   })
KitkatJohn
quelle
2
_id stellt einen Standardparameter für die Kapselung mehrerer Felder dar?
Eugen Sunic
18

Wenn Sie die Gruppierung einschränken müssen, können Sie außerdem Folgendes verwenden:

db.events.aggregate( 
    {$match: {province: "ON"}},
    {$group: {_id: "$date", number: {$sum: 1}}}  
)
andre
quelle
17

Ab MongoDB 3.4 können Sie die $sortByCountAggregation verwenden.

Gruppiert eingehende Dokumente basierend auf dem Wert eines angegebenen Ausdrucks und berechnet dann die Anzahl der Dokumente in jeder einzelnen Gruppe.

https://docs.mongodb.com/manual/reference/operator/aggregation/sortByCount/

Beispielsweise:

db.contest.aggregate([
    { $sortByCount: "$province" }
]);
MattM
quelle
2
Wahrscheinlich ist es erwähnenswert, dass dies $sortByCounttatsächlich ein "Pseudooperator" ist, wie mehrere weitere Aggregationsstufenoperatoren, die aus MongoDB 3.4 eingeführt wurden. Alles, was sie wirklich tun, ist , in ihre jeweiligen Aggregationsstufen zu expandieren . In diesem Fall ein $groupmit $sum: 1wie in vorhandenen Antworten gezeigt und eine zusätzliche $sort Stufe. Sie bieten keinen anderen Vorteil als "weniger Code eingeben" , was möglicherweise aussagekräftiger ist oder nicht (wenn Sie sich für solche Dinge interessieren). Meiner Meinung nach sind unterschiedliche $groupund $sortStufen im Code weitaus aussagekräftiger und in der Tat flexibler.
Neil Lunn
0

Mongo Shell Befehl, der für mich funktioniert hat:

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])
Riha
quelle