Трябва условно да определите ключа за групиране въз основа на това къде текущата дата попада между диапазона. Това основно се постига чрез $cond
с вложени условия и логическия вариант на $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" }
}}
])
Като $cond
е троичен оператор, първото условие се оценява, за да се види дали условието е вярно, и когато е вярно, се връща вторият аргумент, в противен случай третият се връща, когато е невярно. Така че чрез влагане на друг $cond
в фалшивия случай получавате логическия тест за това къде попада датата, или „по-малко от 15-дневната дата“, което означава, че е в най-стария диапазон, или „по-малко от 7 дни“, което означава средния диапазон, или, разбира се, е в най-новата гама.
Просто поставям пред числата тук по-малко от 10 0
така че ви дава нещо за сортиране, ако искате, тъй като изходът на "ключове" в $group
сам по себе си не е подреден.
Но това е начинът, по който правите това в една заявка. Вие просто определяте какъв трябва да бъде ключът за групиране въз основа на това къде пада датата и натрупвате за всеки ключ.