Nowa odpowiedź przy użyciu frameworka agregacji Mongo
Po tym, jak zadano to pytanie i udzielono na nie odpowiedzi, 10gen wypuścił Mongodb w wersji 2.2 ze strukturą agregacji, która jest teraz lepszym sposobem na wykonywanie tego rodzaju zapytań. To zapytanie jest trochę trudne, ponieważ chcesz pogrupować według dat, a przechowywane wartości są sygnaturami czasowymi, więc musisz coś zrobić, aby przekonwertować sygnatury czasowe na daty pasujące. Na potrzeby przykładu napiszę zapytanie, które otrzyma właściwe liczby.
db.col.aggregate(
{ $group: { _id: { $dayOfYear: "$date"},
click: { $sum: 1 } } }
)
To zwróci coś takiego:
[
{
"_id" : 144,
"click" : 165
},
{
"_id" : 275,
"click" : 12
}
]
Musisz użyć $match
aby ograniczyć zapytanie do zakresu dat, który Cię interesuje i $project
zmienić nazwę _id
do date
. Jak przekonwertować dzień roku wstecz na datę, pozostaje ćwiczeniem dla czytelnika. :-)
10gen ma przydatną tabelę konwersji SQL do Mongo Aggregation, którą warto dodać do zakładek. Istnieje również specjalny artykuł na temat operatorów agregacji dat.
Stając się trochę bardziej wyrafinowanym, możesz użyć:
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} }
])
który da ci ostatnie 15 dni i zwróci pewną datę i godzinę w ciągu każdego dnia w date
pole. Na przykład:
[
{
"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")
}
]