0

Ich habe eine mongoDB-Datenbank mit Objekten, die von verschiedenen Benutzern erstellt wurden. Um die Benutzerbindung und aktive Benutzer zu verfolgen, möchte ich einmal pro Woche herausfinden, wie viele verschiedene Benutzer ein neues Objekt erstellt haben.Anzahl der aktiven Benutzer innerhalb der letzten Woche?

Zum Beispiel die Objekte sind "Notizen". Wie kann ich in effektiver Weise zählen, wie viele verschiedene Benutzer eine Notiz innerhalb der letzten Woche erstellt haben?

A Hinweis:

{ 
    "user_id" : "..." 
    "note" : "..." 
    "date" : "..." 
} 

Ich benutze Mungo und NodeJS.

Antwort

1

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.

+0

Wow! Vielen Dank für diese ausführliche Antwort! Ich werde definitiv mehr in Aggregation sehen :) – Jolle

Verwandte Themen