it-swarm.com.de

MongoDB SELECT COUNT GROUP BY

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

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

Mit der Aggregatfunktion scheint es mir aber nicht klar zu sein. 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 einen einfacheren/schnelleren Weg mit der Aggregatfunktion?

114
Steven

Dies wäre der einfachere Weg, dies mit aggregate zu tun:

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

Wenn Sie mehrere Spalten zum Gruppieren benötigen, folgen Sie diesem Modell. Hier führe ich eine Zählung nach status und type durch:

  db.BusinessProcess.aggregate({
    "$group": {
        _id: {
            status: "$status",
            type: "$type"
        },
        count: {
            $sum: 1
        }
    }
   })
37
KitkatJohn

Ich brauche einige zusätzliche Operationen, die auf dem Ergebnis der Aggregatfunktion basieren. 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 Request mit 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 und Zählen mit Sortieren nach Feld:

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

Mehrere Felder gruppieren nach und zählen mit Sortieren anhand von Zählern:

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

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

Diese Art von Abfrage funktionierte für mich:

 db.events.aggregate({$group: {_id : "$date", number:  { $sum : 1} }} )

Siehe http://docs.mongodb.org/manual/tutorial/aggregation-with-user-preference-data/

6
prule

Ab MongoDB 3.4 können Sie die $sortByCount-Aggregation 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/

Zum Beispiel:

db.contest.aggregate([
    { $sortByCount: "$province" }
]);
0
MattM