Bạn cần xác định có điều kiện khóa nhóm dựa trên vị trí ngày hiện tại nằm trong phạm vi. Điều này về cơ bản đạt được thông qua $cond
với các điều kiện lồng nhau và biến thể logic của $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" }
}}
])
Dưới dạng $cond
là một toán tử bậc ba, điều kiện đầu tiên được đánh giá để xem điều kiện có đúng không và khi đúng thì đối số thứ hai được trả về nếu không thì đối số thứ ba được trả về khi sai. Vì vậy, bằng cách lồng một $cond
khác trong trường hợp sai, bạn nhận được bài kiểm tra logic về vị trí của ngày, hoặc "ít hơn 15 ngày" có nghĩa là trong phạm vi cũ nhất hoặc "ít hơn 7 ngày" có nghĩa là phạm vi trung bình, hoặc tất nhiên là trong phạm vi mới nhất.
Tôi chỉ bắt đầu các số ở đây nhỏ hơn 10 bằng 0
vì vậy nó cung cấp cho bạn một cái gì đó để sắp xếp nếu bạn muốn, vì đầu ra của "khóa" trong $group
tự nó không được sắp xếp theo thứ tự.
Nhưng đó là cách bạn thực hiện điều này trong một truy vấn duy nhất. Bạn chỉ cần tìm ra khóa nhóm sẽ dựa trên vị trí của ngày tháng và tích lũy cho mỗi khóa.