MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDb-Aggregation Gruppieren nach Datum

db.foos.aggregate(
    [   
        {   $project : { day : {$substr: ["$TimeStamp", 0, 10] }}},        
        {   $group   : { _id : "$day",  number : { $sum : 1 }}},
        {   $sort    : { _id : 1 }}        
    ]
)

Das Gruppieren nach Datum kann im Aggregationsframework in zwei Schritten erfolgen, ein zusätzlicher dritter Schritt ist zum Sortieren des Ergebnisses erforderlich, wenn eine Sortierung gewünscht wird:

  1. $project in Kombination mit $substr nimmt die ersten 10 Zeichen (YYYY:MM:DD) des ISODate-Objekts aus jedem Dokument (das Ergebnis ist eine Sammlung von Dokumenten mit den Feldern "_id" und "day");
  2. $group Gruppen nach Tag, Hinzufügen (Summieren) der Zahl 1 für jedes übereinstimmende Dokument;
  3. $sort aufsteigend nach "_id", das ist der Tag aus dem vorherigen Aggregationsschritt - dies ist optional, wenn ein sortiertes Ergebnis gewünscht wird.

Diese Lösung kann Indexe wie db.twitter.ensureIndex( { TimeStamp: 1 } ) nicht nutzen , da es das ISODate-Objekt spontan in ein Zeichenfolgenobjekt umwandelt. Bei großen Sammlungen (Millionen von Dokumenten) könnte dies ein Leistungsengpass sein und es sollten ausgefeiltere Ansätze verwendet werden.