db.foos.aggregate(
[
{ $project : { day : {$substr: ["$TimeStamp", 0, 10] }}},
{ $group : { _id : "$day", number : { $sum : 1 }}},
{ $sort : { _id : 1 }}
]
)
Il raggruppamento per data può essere eseguito in due passaggi nel framework di aggregazione, è necessario un terzo passaggio aggiuntivo per ordinare il risultato, se si desidera l'ordinamento:
$project
in combinazione con$substr
prende i primi 10 caratteri (AAAA:MM:GG) dell'oggetto ISODate da ciascun documento (il risultato è una raccolta di documenti con i campi "_id" e "giorno");$group
gruppi per giorno, sommando (sommando) il numero 1 per ogni documento corrispondente;$sort
ascendente per "_id", che è il giorno dal passaggio precedente dell'aggregazione - questo è facoltativo se si desidera un risultato ordinato.
Questa soluzione non può sfruttare indici come db.twitter.ensureIndex( { TimeStamp: 1 } )
, perché trasforma al volo l'oggetto ISODate in un oggetto stringa. Per raccolte di grandi dimensioni (milioni di documenti) questo potrebbe rappresentare un collo di bottiglia nelle prestazioni e dovrebbero essere utilizzati approcci più sofisticati.