Nyt svar ved hjælp af Mongo-aggregationsramme
Efter at dette spørgsmål var stillet og besvaret, udgav 10gen Mongodb version 2.2 med en aggregeringsramme, som nu er den bedre måde at udføre denne form for forespørgsel på. Denne forespørgsel er lidt udfordrende, fordi du vil gruppere efter dato, og de gemte værdier er tidsstempler, så du skal gøre noget for at konvertere tidsstemplerne til datoer, der matcher. Som eksempel vil jeg bare skrive en forespørgsel, der får de rigtige tal.
db.col.aggregate(
{ $group: { _id: { $dayOfYear: "$date"},
click: { $sum: 1 } } }
)
Dette vil returnere noget som:
[
{
"_id" : 144,
"click" : 165
},
{
"_id" : 275,
"click" : 12
}
]
Du skal bruge $match
for at begrænse forespørgslen til det datointerval, du er interesseret i, og $project
for at omdøbe _id
til date
. Hvordan du konverterer dagen på året tilbage til en dato, overlades som en øvelse for læseren. :-)
10gen har et praktisk SQL til Mongo Aggregation-konverteringsdiagram, der er værd at bogmærke. Der er også en specifik artikel om datosammenlægningsoperatører.
Hvis du bliver lidt mere avanceret, kan du bruge:
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} }
])
som vil give dig de seneste 15 dage og returnere noget datetime inden for hver dag i date
Mark. For eksempel:
[
{
"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")
}
]