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")
}
]