S agregačním rámcem se bude výsledek mírně lišit od vašeho „požadovaného“ výstupu, protože místo hash klíčů získáte pole objektů s _id
klíč s hodnotou, která vás představuje skupinu po poli. Například místo
{
"28-10-2016":{
"success_count": 10,
"failure_count": 10
},
"29-10-2016": {
"success_count": 10,
"failure_count": 10
}
}
měli byste lepší strukturu jako
[
{
"_id": "28-10-2016",
"success_count": 10,
"failure_count": 10
},
"_id": "29-10-2016",
"success_count": 10,
"failure_count": 10
}
]
Dosažení výše uvedeného výsledku by vyžadovalo použití $cond
operátor v $sum
provozovatel akumulátoru. $cond
operátor vyhodnotí logickou podmínku na základě jejího prvního argumentu (if) a poté vrátí druhý argument, pokud je vyhodnocení pravdivé (pak) nebo třetí argument, pokud je nepravda (else). Tím se logika pravda/nepravda převede na číselné hodnoty 1 a 0, které se převedou do $sum
respektive:
"success_count": {
"$sum": {
"$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
}
}
Jako výsledný kanál je třeba spustit operaci agregace, která používá $dateToString
operátor v _id
klíčový výraz pro $group
potrubí:
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);
})
Existuje však flexibilnější a výkonnější přístup, který se provádí mnohem rychleji než výše uvedený, kde nejúčinnější datová struktura pro váš výsledek agregace následuje například schéma:
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 }
]
}
]
Poté zvažte spuštění alternativního kanálu následujícím způsobem
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);
})