db.foos.aggregate(
[
{ $project : { day : {$substr: ["$TimeStamp", 0, 10] }}},
{ $group : { _id : "$day", number : { $sum : 1 }}},
{ $sort : { _id : 1 }}
]
)
Grupowanie według daty można wykonać w dwóch krokach w ramach agregacji, dodatkowy trzeci krok jest potrzebny do sortowania wyniku, jeśli sortowanie jest pożądane:
$project
w połączeniu z$substr
pobiera pierwszych 10 znaków (RRRR:MM:DD) obiektu ISODate z każdego dokumentu (wynikiem jest zbiór dokumentów z polami „_id” i „day”);$group
grupuje według dnia, dodając (podsumowując) numer 1 dla każdego pasującego dokumentu;$sort
rosnąco według „_id”, który jest dniem z poprzedniego kroku agregacji — jest to opcjonalne, jeśli pożądany jest posortowany wynik.
To rozwiązanie nie może korzystać z indeksów takich jak db.twitter.ensureIndex( { TimeStamp: 1 } )
, ponieważ w locie przekształca obiekt ISODate w obiekt tekstowy. W przypadku dużych zbiorów (miliony dokumentów) może to stanowić wąskie gardło wydajności i należy stosować bardziej wyrafinowane podejścia.