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?
Dies wäre der einfachere Weg, dies mit aggregate
zu tun:
db.contest.aggregate([
{"$group" : {_id:"$province", count:{$sum:1}}}
])
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
}
}
})
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}}
])
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}}}
)
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/
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" }
]);