der Annahme, dass die Sammlung in einem Note
namens Modell angebracht ist und die Daten in "date"
ist tatsächlich ein gültiges Date
Objekt, dann im Wesentlichen die Daten für zwischen den angegebenen Terminen und Aggregat abfragen:
// Work out days for start of tomorrow and one week before
const oneDay = 1000 * 60 * 60 * 24,
oneWeek = oneDay * 7;
const d = Date.now();
const lastDay = d - (d % oneDay) + oneDay;
const firstDay = lastDay - oneWeek;
// Run the aggregation
Note.aggregate([
// $match is a query to select the week
{ "$match": { "date": { "$gte": new Date(firstday), "$lt": new Date(lastDay) } },
// $group on the distinct users
{ "$group": { "_id": "$user_id" } },
// $group to count the total
{ "$group": { "_id": null, "count": { "$sum": 1 } } }
],function(err, results) {
// results in here
})
Die $match
ist eine "Abfrage" wie jede andere MongoDB-Abfrageanweisung. Sie verwenden die Operatoren $gte
und $lt
, um den "Bereich" der Werte darzustellen, die dazwischen liegen können. Dies ist eigentlich eine Abkürzung, um eine UND-Bedingung zu schreiben, ohne den Begriff explizit anzugeben.
Die nächste Stufe ist ein $group
die wir durch Anwendung der Gruppierung Schlüssel zu „Aggregate“ der "user_id
"Felddaten als‚distinct‘Werte verwenden, die _id
ist. Die Ausgabe eines Gruppierungsschlüssels ist immer einzigartig.
die letzte Stufe ist ein weiterer $group
, wo diesmal die Gruppierungsschlüssel sind null
anstatt mit einem Wert vorhanden Feld. das bedeutet, „Gruppe alles“, so dass wir am Ende mit einer einzigen Reihe auf, die auf dem Wert den $sum
Betrieb gilt von 1
, um die "Zählung" zu bewirken.
So funktioniert Aggregation "Pipelines", da jede "Stufe" in die nächste fließt. So ist "Query" -> "Aggregat Distinct" -> "Aggregat Total" das Muster, bei dem das Wichtigste ist, dass jede Stufe nur die Ansicht der Daten sehen kann, die von der vorherigen Stufe ausgegeben wurden.
Sobald Sie diese Konzepte erhalten, ist dies einfach.
Wow! Vielen Dank für diese ausführliche Antwort! Ich werde definitiv mehr in Aggregation sehen :) – Jolle