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

grouper par dates dans mongodb

Nouvelle réponse utilisant le framework d'agrégation Mongo

Après avoir posé cette question et répondu, 10gen a publié la version 2.2 de Mongodb avec un cadre d'agrégation, qui est maintenant la meilleure façon de faire ce type de requête. Cette requête est un peu difficile car vous souhaitez regrouper par date et les valeurs stockées sont des horodatages, vous devez donc faire quelque chose pour convertir les horodatages en dates qui correspondent. Aux fins de l'exemple, je vais simplement écrire une requête qui obtient les bons comptes.

db.col.aggregate(
   { $group: { _id: { $dayOfYear: "$date"},
               click: { $sum: 1 } } }
   )

Cela renverra quelque chose comme :

[
    {
        "_id" : 144,
        "click" : 165
    },
    {
        "_id" : 275,
        "click" : 12
    }
]

Vous devez utiliser $match pour limiter la requête à la plage de dates qui vous intéresse et $project pour renommer _id à date . La façon dont vous convertissez le jour de l'année en une date est laissée en exercice au lecteur. :-)

10gen a un tableau de conversion pratique SQL vers Mongo Aggregation qui vaut la peine d'être mis en signet. Il existe également un article spécifique sur les opérateurs d'agrégation de dates.

Devenant un peu plus fantaisiste, vous pouvez utiliser :

db.col.aggregate([
  { $group: {
      _id: {
        $add: [
         { $dayOfYear: "$date"}, 
         { $multiply: 
           [400, {$year: "$date"}]
         }
      ]},   
      click: { $sum: 1 },
      first: {$min: "$date"}
    }
  },
  { $sort: {_id: -1} },
  { $limit: 15 },
  { $project: { date: "$first", click: 1, _id: 0} }
])

qui vous donnera les 15 derniers jours et renverra une date-heure dans chaque jour dans la date domaine. Par exemple :

[
    {
        "click" : 431,
        "date" : ISODate("2013-05-11T02:33:45.526Z")
    },
    {
        "click" : 702,
        "date" : ISODate("2013-05-08T02:11:00.503Z")
    },
            ...
    {
        "click" : 814,
        "date" : ISODate("2013-04-25T00:41:45.046Z")
    }
]