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?

Antworten:


326

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

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

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}}
])

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
        }
    }
   })

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}}}  
)

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" }
]);

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"}}}])
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.