MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

raggruppa per date in mongodb

Nuova risposta utilizzando il framework di aggregazione Mongo

Dopo che questa domanda è stata posta e ha risposto, 10gen ha rilasciato Mongodb versione 2.2 con un framework di aggregazione, che ora è il modo migliore per eseguire questo tipo di query. Questa query è un po' impegnativa perché vuoi raggruppare per data e i valori archiviati sono timestamp, quindi devi fare qualcosa per convertire i timestamp in date che corrispondono. Ai fini dell'esempio scriverò solo una query che ottiene i conteggi corretti.

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

Questo restituirà qualcosa come:

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

Devi usare $match per limitare la query all'intervallo di date che ti interessa e $project per rinominare _id a date . Il modo in cui si converte il giorno dell'anno in una data è lasciato come esercizio per il lettore. :-)

10gen ha un pratico grafico di conversione da SQL a Mongo Aggregation che vale la pena aggiungere ai segnalibri. C'è anche un articolo specifico sugli operatori di aggregazione di date.

Diventando un po' più elaborato, puoi usare:

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

che ti darà gli ultimi 15 giorni e restituirà un po' di data e ora entro ogni giorno nella date campo. Ad esempio:

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