Với khung tổng hợp, kết quả sẽ hơi khác so với đầu ra "mong muốn" của bạn vì thay vì có các khóa băm, bạn nhận được một mảng các đối tượng có _id
khóa có giá trị đại diện cho bạn nhóm theo trường. Ví dụ:thay vì
{
"28-10-2016":{
"success_count": 10,
"failure_count": 10
},
"29-10-2016": {
"success_count": 10,
"failure_count": 10
}
}
bạn sẽ có một cấu trúc tốt hơn như
[
{
"_id": "28-10-2016",
"success_count": 10,
"failure_count": 10
},
"_id": "29-10-2016",
"success_count": 10,
"failure_count": 10
}
]
Để đạt được kết quả ở trên sẽ yêu cầu sử dụng $cond
toán tử trong $sum
toán tử tích lũy. $cond
toán tử sẽ đánh giá một điều kiện logic dựa trên đối số đầu tiên của nó (nếu) và sau đó trả về đối số thứ hai trong đó đánh giá là đúng (sau đó) hoặc đối số thứ ba là sai (khác). Điều này chuyển đổi logic đúng / sai thành các giá trị số 1 và 0 cấp vào $sum
tương ứng:
"success_count": {
"$sum": {
"$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
}
}
Là một đường dẫn kết quả, một người cần chạy hoạt động tổng hợp sử dụng $dateToString
toán tử trong _id
biểu thức khóa cho $group
đường ống:
Orders.aggregate([
{
"$group": {
"_id": {
"$dateToString": {
"format": "%Y-%m-%d",
"date": "$created_at"
}
},
"success_count": {
"$sum": {
"$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
}
},
"failure_count": {
"$sum": {
"$cond": [ { "$eq": [ "$status", "failure" ] }, 1, 0 ]
}
}
}
}
], function (err, orders){
if (err) throw err;
console.log(orders);
})
Tuy nhiên, có một cách tiếp cận linh hoạt hơn và hoạt động tốt hơn, thực thi nhanh hơn nhiều so với cách trên, trong đó cấu trúc dữ liệu hiệu quả nhất cho kết quả tổng hợp của bạn tuân theo lược đồ, ví dụ:
orders = [
{
"_id": "28-10-2016",
"counts": [
{ "status": "success", "count": 10 },
{ "status": "failure", "count": 10 }
]
},
{
"_id": "29-10-2016",
"counts": [
{ "status": "success", "count": 10 },
{ "status": "failure", "count": 10 }
]
}
]
Sau đó, hãy xem xét chạy một đường dẫn thay thế như sau
Orders.aggregate([
{
"$group": {
"_id": {
"date": {
"$dateToString": {
"format": "%Y-%m-%d",
"date": "$created_at"
}
},
"status": { "$toLower": "$status" }
},
"count": { "$sum": 1 }
}
},
{
"$group": {
"_id": "$_id.date",
"counts": {
"$push": {
"status": "$_id.status",
"count": "$count"
}
}
}
}
], function (err, orders){
if (err) throw err;
console.log(orders);
})