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:
$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");$group
Gruppen nach Tag, Hinzufügen (Summieren) der Zahl 1 für jedes übereinstimmende Dokument;$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.