Neue Antwort unter Verwendung des Mongo-Aggregationsframeworks
Nachdem diese Frage gestellt und beantwortet wurde, veröffentlichte 10gen Mongodb Version 2.2 mit einem Aggregations-Framework, das nun der bessere Weg ist, um diese Art von Abfrage durchzuführen. Diese Abfrage ist ein wenig schwierig, da Sie nach Datum gruppieren möchten und die gespeicherten Werte Zeitstempel sind. Sie müssen also etwas tun, um die Zeitstempel in übereinstimmende Daten umzuwandeln. Als Beispiel werde ich nur eine Abfrage schreiben, die die richtigen Zählwerte erhält.
db.col.aggregate(
{ $group: { _id: { $dayOfYear: "$date"},
click: { $sum: 1 } } }
)
Dies gibt etwas zurück wie:
[
{
"_id" : 144,
"click" : 165
},
{
"_id" : 275,
"click" : 12
}
]
Sie müssen $match
verwenden um die Abfrage auf den Datumsbereich zu beschränken, an dem Sie interessiert sind, und $project
um _id
umzubenennen bis date
. Wie Sie den Tag des Jahres wieder in ein Datum umwandeln, bleibt dem Leser als Übung überlassen. :-)
10gen hat ein praktisches Umrechnungsdiagramm für die SQL-zu-Mongo-Aggregation, das es wert ist, mit einem Lesezeichen versehen zu werden. Es gibt auch einen speziellen Artikel über Datumsaggregationsoperatoren.
Wenn Sie ein wenig ausgefallener werden, können Sie Folgendes verwenden:
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} }
])
Dadurch erhalten Sie die letzten 15 Tage und geben einige Datums- und Uhrzeitangaben innerhalb jedes Tages im date
zurück Feld. Zum Beispiel:
[
{
"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")
}
]