Dengan kerangka kerja agregasi, hasilnya akan sedikit berbeda dari keluaran "yang diinginkan" karena alih-alih memiliki kunci hash, Anda mendapatkan larik objek dengan _id
kunci yang memiliki nilai yang mewakili Anda mengelompokkan berdasarkan bidang. Misalnya, alih-alih
{
"28-10-2016":{
"success_count": 10,
"failure_count": 10
},
"29-10-2016": {
"success_count": 10,
"failure_count": 10
}
}
Anda akan memiliki struktur yang lebih baik seperti
[
{
"_id": "28-10-2016",
"success_count": 10,
"failure_count": 10
},
"_id": "29-10-2016",
"success_count": 10,
"failure_count": 10
}
]
Untuk mencapai hasil di atas akan memerlukan penggunaan $cond
operator di $sum
operator akumulator. $cond
operator akan mengevaluasi kondisi logis berdasarkan argumen pertama (jika) dan kemudian mengembalikan argumen kedua di mana evaluasi itu benar (kemudian) atau argumen ketiga di mana salah (lain). Ini mengubah logika benar/salah menjadi nilai numerik 1 dan 0 yang dimasukkan ke $sum
masing-masing:
"success_count": {
"$sum": {
"$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
}
}
Sebagai pipa yang dihasilkan, seseorang perlu menjalankan operasi agregasi yang menggunakan $dateToString
operator di _id
ekspresi kunci untuk $group
saluran:
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);
})
Namun, ada pendekatan yang lebih fleksibel dan berkinerja lebih baik yang dijalankan jauh lebih cepat daripada di atas, di mana struktur data yang paling efisien untuk hasil agregasi Anda mengikuti skema misalnya:
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 }
]
}
]
Kemudian pertimbangkan untuk menjalankan jalur pipa alternatif sebagai berikut
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);
})