Jawaban baru menggunakan kerangka agregasi Mongo
Setelah pertanyaan ini ditanyakan dan dijawab, 10gen merilis Mongodb versi 2.2 dengan kerangka kerja agregasi, yang sekarang merupakan cara yang lebih baik untuk melakukan kueri semacam ini. Kueri ini sedikit menantang karena Anda ingin mengelompokkan berdasarkan tanggal dan nilai yang disimpan adalah stempel waktu, jadi Anda harus melakukan sesuatu untuk mengonversi stempel waktu menjadi tanggal yang cocok. Untuk keperluan contoh saya hanya akan menulis kueri yang mendapatkan jumlah yang tepat.
db.col.aggregate(
{ $group: { _id: { $dayOfYear: "$date"},
click: { $sum: 1 } } }
)
Ini akan mengembalikan sesuatu seperti:
[
{
"_id" : 144,
"click" : 165
},
{
"_id" : 275,
"click" : 12
}
]
Anda perlu menggunakan $match
untuk membatasi kueri pada rentang tanggal yang Anda minati dan $project
untuk mengganti nama _id
untuk date
. Bagaimana Anda mengubah hari dalam setahun kembali ke tanggal yang tersisa sebagai latihan untuk pembaca. :-)
10gen memiliki bagan konversi SQL ke Mongo Aggregation yang berguna untuk di-bookmark. Ada juga artikel khusus tentang operator agregasi tanggal.
Menjadi sedikit lebih menarik, Anda dapat menggunakan:
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} }
])
yang akan memberi Anda 15 hari terakhir dan mengembalikan beberapa waktu dalam setiap hari di date
bidang. Misalnya:
[
{
"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")
}
]