Nieuw antwoord met Mongo-aggregatieraamwerk
Nadat deze vraag was gesteld en beantwoord, bracht 10gen Mongodb versie 2.2 uit met een aggregatieraamwerk, wat nu de betere manier is om dit soort zoekopdrachten uit te voeren. Deze query is een beetje uitdagend omdat je op datum wilt groeperen en de opgeslagen waarden tijdstempels zijn, dus je moet iets doen om de tijdstempels te converteren naar datums die overeenkomen. Voor de doeleinden van het voorbeeld zal ik gewoon een query schrijven die de juiste tellingen krijgt.
db.col.aggregate(
{ $group: { _id: { $dayOfYear: "$date"},
click: { $sum: 1 } } }
)
Dit geeft iets terug als:
[
{
"_id" : 144,
"click" : 165
},
{
"_id" : 275,
"click" : 12
}
]
Je moet $match
. gebruiken om de zoekopdracht te beperken tot de periode waarin u geïnteresseerd bent en $project
om _id
te hernoemen tot date
. Hoe je de dag van het jaar terug naar een datum converteert, blijft een oefening voor de lezer. :-)
10gen heeft een handige conversietabel van SQL naar Mongo Aggregation die het waard is om te bookmarken. Er is ook een specifiek artikel over operatoren voor datumaggregatie.
Om een beetje liefhebber te worden, kunt u het volgende gebruiken:
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} }
])
waarmee je de laatste 15 dagen krijgt en binnen elke dag wat datetime teruggeeft in de date
veld. Bijvoorbeeld:
[
{
"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")
}
]