2016-12-06 4 views
3

Ich bin mit NodeJS und mongodb für DatenbankMongoose Aggregation groupby am Tag, Woche, Jahr

Mein Dokument ist:

{ 
    "_id": "58466d6a0b3f4d2e2fa22905", 
    "updatedAt": "2016-12-06T07:48:58.435Z", 
    "createdAt": "2017-12-06T07:48:58.435Z", 
    "userId": "56d04e265a2100c72a311334", 
    "__v": 0 
    } 

Benutzer geben VonDatum, toDate und Frequenz in Clientside, in dem Wert Frequenz sei 0,1,2 wo 0 bedeutet Tag, 1 bedeutet Woche, 2 bedeutet Jahr.

Auf Basis von oben Daten möchte ich

für ex Bericht erstellen: Wenn Benutzer geben VonDatum = 2016.12.01 und toDate = 2016.12.06.

wenn Frequenz 0 ist das Ergebnis wäre

{ 
    2016-12-01:{ 
    count:1 
      } 
    2016-12-02:{ 
     count:7 
     } 
    2016-12-06:{ 
     count:8 
     } 
    } 

, wenn Frequenz 1 ist das Ergebnis

{ 
    2016-12-01 to 2016-12-06:{ 
    count:16 
      } 
    } 

sein würde, wenn die Frequenz 2 ist das Ergebnis sei

{ 
    2016:{ 
    count:16 
      } 
    } 

In welcher Zählung Anzahl der Dokumente

ich so getan habe:

var aggregate = [{ 
     $match: { 
      createdAt: { 
       $gte: fromDate, 
       $lt: toDate 
      } 
     } 
    }, { 
     $group: { 
      // what should i will do here 
      }, 
      count: { 
       $sum: 1 
      } 
     } 
    }] 

    return LoginReportModel.aggregate(aggregate).exec(); 

ODER Jeder weiß, anderen besseren Ansatz wie auch willkommen

mit lodash

Editiert: Ich auch möchte, dass die Anzahl der Dokumente auf userId eindeutig ist

Antwort

2

C Heck aus der Dokumentation auf $dateToString

Sie es tun könnten wie folgt aus:

var frequency = 2 

var frequencyDateFormatMap = { 
    0: '%Y-%m-%d', 
    1: '%U', 
    2: '%Y' 
} 

var frequencyDateFormat = frequencyDateFormatMap[frequency] 

var aggregate = [ 
    {$match: { 
    createdAt: { 
     $gte: fromDate, 
     $lt: toDate 
    } 
    }}, 
    {$project: { 
    frequency: { 
     $dateToString: { 
     format: frequencyDateFormat, 
     date: '$createdAt' 
     } 
    } 
    }}, 
    {$group: { 
    _id: '$frequency', 
    count: { 
     $sum: 1 
    } 
    }} 
] 

return LoginReportModel.aggregate(aggregate).exec() 
+0

können Sie mir helfen, auf dem oberen Problem – Sam

+0

Ich habe ein Beispiel, ist der einzige Unterschied, dass für die Frequenz 1 es die Wochennummer ausgibt als Gruppenschlüssel anstelle einer Zeichenfolge wie "2016-12-01 bis 2016-12-06". Ich hoffe es hilft! – Rudi

+0

Danke für Hilfe! Diese Sache kann ich auch mit $ dayOfMonth und $ year erreichen. Aber das Hauptproblem ist mit der Woche. Wie kann ich diese Woche Nummer umwandeln, wie ich oben erwähnt, weil ich hv über Daten in Excel-Datei schreiben, um Bericht – Sam

Verwandte Themen