Anda perlu menentukan kunci pengelompokan secara kondisional berdasarkan di mana tanggal saat ini berada di antara rentang. Ini pada dasarnya dicapai melalui $cond
dengan kondisi bersarang dan varian logis dari $lt
:
// work out dates somehow
var today = new Date(),
oneDay = ( 1000 * 60 * 60 * 24 ),
thirtyDays = new Date( today.valueOf() - ( 30 * oneDay ) ),
fifteenDays = new Date( today.valueOf() - ( 15 * oneDay ) ),
sevenDays = new Date( today.valueOf() - ( 7 * oneDay ) );
db.collection.aggregate([
{ "$match": {
"date": { "$gte": thirtyDays }
}},
{ "$group": {
"_id": {
"$cond": [
{ "$lt": [ "$date", fifteenDays ] },
"16-30",
{ "$cond": [
{ "$lt": [ "$date", sevenDays ] },
"08-15",
"01-07"
]}
]
},
"count": { "$sum": 1 },
"totalValue": { "$sum": "$value" }
}}
])
Sebagai $cond
adalah operator ternary, kondisi pertama dievaluasi untuk melihat apakah kondisinya benar, dan ketika benar, argumen kedua dikembalikan jika tidak, yang ketiga dikembalikan ketika salah. Jadi dengan membuat sarang $cond
. yang lain dalam kasus palsu Anda mendapatkan tes logis di mana tanggal jatuh, baik "kurang dari tanggal 15 hari" yang berarti dalam rentang terlama, atau "kurang dari 7 hari" yang berarti rentang tengah, atau tentu saja dalam rentang terbaru.
Saya hanya mengawali angka di sini kurang dari 10 dengan 0
jadi ini memberi Anda sesuatu untuk diurutkan jika Anda mau, karena output dari "kunci" di $group
tidak dengan sendirinya dipesan.
Tapi begitulah cara Anda melakukannya dalam satu kueri. Anda tinggal menentukan kunci pengelompokan apa yang harus didasarkan pada tanggal jatuh dan akumulasi untuk setiap kunci.