Nová odpověď pomocí agregačního rámce Mongo
Poté, co byla tato otázka položena a zodpovězena, 10gen vydala Mongodb verze 2.2 s agregačním rámcem, což je nyní lepší způsob, jak provádět tento druh dotazů. Tento dotaz je trochu náročný, protože chcete seskupit podle data a uložené hodnoty jsou časová razítka, takže musíte udělat něco pro převod časových razítek na data, která se shodují. Pro účely příkladu napíšu pouze dotaz, který dostane správné počty.
db.col.aggregate(
{ $group: { _id: { $dayOfYear: "$date"},
click: { $sum: 1 } } }
)
To vrátí něco jako:
[
{
"_id" : 144,
"click" : 165
},
{
"_id" : 275,
"click" : 12
}
]
Musíte použít $match
pro omezení dotazu na časové období, které vás zajímá, a $project
přejmenovat _id
do date
. Jak převést den v roce zpět na datum je ponecháno jako cvičení pro čtenáře. :-)
10gen má praktický graf konverze SQL na Mongo agregaci, který stojí za to přidat do záložek. Existuje také zvláštní článek o operátorech agregace dat.
Když budete trochu milejší, můžete použít:
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} }
])
což vám poskytne posledních 15 dní a vrátí nějaké datum a čas v každém dni v date
pole. Například:
[
{
"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")
}
]