db.foos.aggregate(
[
{ $project : { day : {$substr: ["$TimeStamp", 0, 10] }}},
{ $group : { _id : "$day", number : { $sum : 1 }}},
{ $sort : { _id : 1 }}
]
)
Seskupit podle data lze v rámci agregace provést ve dvou krocích, další třetí krok je nutný pro seřazení výsledku, pokud je řazení požadováno:
$project
v kombinaci s$substr
vezme prvních 10 znaků (RRRR:MM:DD) objektu ISODate z každého dokumentu (výsledkem je kolekce dokumentů s poli „_id“ a „den“);$group
skupiny podle dne, přidáním (sečtením) čísla 1 pro každý odpovídající dokument;$sort
vzestupně podle „_id“, což je den od předchozího kroku agregace – toto je volitelné, pokud požadujete seřazený výsledek.
Toto řešení nemůže využívat indexy jako db.twitter.ensureIndex( { TimeStamp: 1 } )
, protože transformuje objekt ISODate na objekt typu string za běhu. U velkých sbírek (milionů dokumentů) by to mohlo představovat překážku výkonu a měly by být použity sofistikovanější přístupy.