MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Agrégation MongoDb Regrouper par date

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é :

  1. $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");
  2. $group regroupe par jour, en ajoutant (additionnant) le chiffre 1 pour chaque document correspondant ;
  3. $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.