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