db.foos.aggregate(
[
{ $project : { day : {$substr: ["$TimeStamp", 0, 10] }}},
{ $group : { _id : "$day", number : { $sum : 1 }}},
{ $sort : { _id : 1 }}
]
)
Agrupar por data pode ser feito em duas etapas na estrutura de agregação, uma terceira etapa adicional é necessária para classificar o resultado, se a classificação for desejada:
$project
em combinação com$substr
pega os primeiros 10 caracteres (AAAA:MM:DD) do objeto ISODate de cada documento (o resultado é uma coleção de documentos com os campos "_id" e "day");$group
agrupa por dia, somando (somando) o número 1 para cada documento correspondente;$sort
ascendente por "_id", que é o dia da etapa de agregação anterior - isso é opcional se o resultado classificado for desejado.
Esta solução não pode tirar proveito de índices como
db.twitter.ensureIndex( { TimeStamp: 1 } )
, porque transforma o objeto ISODate em um objeto de string dinamicamente. Para grandes coleções (milhões de documentos), isso pode ser um gargalo de desempenho e abordagens mais sofisticadas devem ser usadas.