С рамката за агрегиране резултатът ще бъде малко по-различен от вашия „желан“ изход, тъй като вместо да имате хеш ключове, получавате масив от обекти с _id
ключ със стойност, която представлява групата ви по поле. Например вместо
{
"28-10-2016":{
"success_count": 10,
"failure_count": 10
},
"29-10-2016": {
"success_count": 10,
"failure_count": 10
}
}
бихте имали по-добра структура като
[
{
"_id": "28-10-2016",
"success_count": 10,
"failure_count": 10
},
"_id": "29-10-2016",
"success_count": 10,
"failure_count": 10
}
]
Постигането на горния резултат ще изисква използването на $cond
оператор в $sumкод>
акумулатор оператор. $cond
ще оцени логическо условие въз основа на първия му аргумент (if) и след това ще върне втория аргумент, където оценката е вярна (then) или третия аргумент, когато е false (else). Това преобразува логиката true/false в 1 и 0 числови стойности, които се подават в $sum
съответно:
"success_count": {
"$sum": {
"$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
}
}
Като резултат от конвейера трябва да се изпълни операцията за агрегиране, която използва $dateToString
оператор в _id
ключов израз за $group
тръбопровод:
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);
})
Съществува обаче по-гъвкав и по-ефективен подход, който се изпълнява много по-бързо от горния, където най-ефективната структура на данните за вашия резултат от агрегирането следва схемата, например:
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 }
]
}
]
След това помислете за стартиране на алтернативен тръбопровод, както следва
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);
})