db.foos.aggregate(
[
{ $project : { day : {$substr: ["$TimeStamp", 0, 10] }}},
{ $group : { _id : "$day", number : { $sum : 1 }}},
{ $sort : { _id : 1 }}
]
)
Agrupar por fecha se puede hacer en dos pasos en el marco de agregación, se necesita un tercer paso adicional para ordenar el resultado, si se desea ordenar:
$project
en combinación con$substr
toma los primeros 10 caracteres (AAAA:MM:DD) del objeto ISODate de cada documento (el resultado es una colección de documentos con los campos "_id" y "día");$group
agrupa por día, sumando (sumando) el número 1 para cada documento coincidente;$sort
ascendente por "_id", que es el día desde el paso de agregación anterior; esto es opcional si se desea un resultado ordenado.
Esta solución no puede aprovechar índices como db.twitter.ensureIndex( { TimeStamp: 1 } )
, porque transforma el objeto ISODate en un objeto de cadena sobre la marcha. Para colecciones grandes (millones de documentos), esto podría ser un cuello de botella en el rendimiento y se deben utilizar enfoques más sofisticados.