db.foos.aggregate(
[
{ $project : { day : {$substr: ["$TimeStamp", 0, 10] }}},
{ $group : { _id : "$day", number : { $sum : 1 }}},
{ $sort : { _id : 1 }}
]
)
Групирането по дата може да се извърши на две стъпки в рамката за агрегиране, необходима е допълнителна трета стъпка за сортиране на резултата, ако се желае сортиране:
$project
в комбинация с$substr
взема първите 10 знака (ГГГГ:ММ:ДД) от обекта ISODate от всеки документ (резултатът е колекция от документи с полета "_id" и "day");$group
групи по дни, добавяне (сумиране) на числото 1 за всеки съответстващ документ;$sort
възходящо по "_id", който е денят от предишната стъпка на агрегиране - това не е задължително, ако се желае сортиран резултат.
Това решение не може да се възползва от индекси като db.twitter.ensureIndex( { TimeStamp: 1 } )
, защото преобразува ISODate обекта в низов обект в движение. За големи колекции (милиони документи) това може да е пречка за производителността и трябва да се използват по-сложни подходи.