db.foos.aggregate(
[
{ $project : { day : {$substr: ["$TimeStamp", 0, 10] }}},
{ $group : { _id : "$day", number : { $sum : 1 }}},
{ $sort : { _id : 1 }}
]
)
Le regroupement par date peut être effectué en deux étapes dans le cadre d'agrégation, une troisième étape supplémentaire est nécessaire pour trier le résultat, si le tri est souhaité :
$project
en combinaison avec$substr
prend les 10 premiers caractères (YYYY:MM:DD) de l'objet ISODate de chaque document (le résultat est une collection de documents avec les champs "_id" et "day");$group
regroupe par jour, en ajoutant (additionnant) le chiffre 1 pour chaque document correspondant ;$sort
croissant par "_id", qui est le jour de l'étape d'agrégation précédente - ceci est facultatif si un résultat trié est souhaité.
Cette solution ne peut pas tirer parti des index comme db.twitter.ensureIndex( { TimeStamp: 1 } )
, car il transforme l'objet ISODate en objet chaîne à la volée. Pour les grandes collections (des millions de documents), cela pourrait être un goulot d'étranglement des performances et des approches plus sophistiquées doivent être utilisées.