Нов отговор, използващ рамката за агрегиране на Mongo
След като този въпрос беше зададен и отговорен, 10gen пусна Mongodb версия 2.2 с рамка за агрегиране, която сега е по-добрият начин за извършване на този вид заявка. Тази заявка е малко предизвикателна, защото искате да групирате по дата и съхранените стойности са времеви печати, така че трябва да направите нещо, за да преобразувате времевите отпечатъци в дати, които съвпадат. За целите на примера просто ще напиша заявка, която получава правилния брой.
db.col.aggregate(
{ $group: { _id: { $dayOfYear: "$date"},
click: { $sum: 1 } } }
)
Това ще върне нещо като:
[
{
"_id" : 144,
"click" : 165
},
{
"_id" : 275,
"click" : 12
}
]
Трябва да използвате $match
за да ограничите заявката до периода от време, който ви интересува и $project
за преименуване на _id
до date
. Как преобразувате деня от годината обратно в дата е оставено като упражнение за читателя. :-)
10gen има удобна диаграма за преобразуване на SQL към Mongo Aggregation, която си струва да направите отметка. Има и конкретна статия за операторите за агрегиране на дати.
Ако станете малко по-привлекателни, можете да използвате:
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} }
])
което ще ви осигури последните 15 дни и ще върне някаква дата и час в рамките на всеки ден в date
поле. Например:
[
{
"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")
}
]