sql >> Base de Datos >  >> NoSQL >> MongoDB

agrupar por fechas en mongodb

Nueva respuesta utilizando el marco de agregación de Mongo

Después de que se hiciera y respondiera esta pregunta, 10gen lanzó la versión 2.2 de Mongodb con un marco de agregación, que ahora es la mejor manera de hacer este tipo de consulta. Esta consulta es un poco desafiante porque desea agrupar por fecha y los valores almacenados son marcas de tiempo, por lo que debe hacer algo para convertir las marcas de tiempo en fechas que coincidan. A los efectos del ejemplo, solo escribiré una consulta que obtenga los recuentos correctos.

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

Esto devolverá algo como:

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

Necesitas usar $match para limitar la consulta al intervalo de fechas que le interesa y $project para cambiar el nombre de _id a date . Cómo convertir el día del año en una fecha se deja como ejercicio para el lector. :-)

10gen tiene un práctico cuadro de conversión de agregación de SQL a Mongo que vale la pena marcar. También hay un artículo específico sobre operadores de agregación de fechas.

Volviéndose un poco más elegante, puede usar:

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} }
])

que obtendrá los últimos 15 días y devolverá una fecha y hora dentro de cada día en la date campo. Por ejemplo:

[
    {
        "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")
    }
]