Med aggregeringsrammen vil resultatet være lidt anderledes end dit "ønskede" output, da du i stedet for at have hash-nøgler får en række objekter med _id
nøgle med en værdi, der repræsenterer dig grupper efter felt. For eksempel i stedet for
{
"28-10-2016":{
"success_count": 10,
"failure_count": 10
},
"29-10-2016": {
"success_count": 10,
"failure_count": 10
}
}
du ville have en bedre struktur som
[
{
"_id": "28-10-2016",
"success_count": 10,
"failure_count": 10
},
"_id": "29-10-2016",
"success_count": 10,
"failure_count": 10
}
]
For at opnå ovenstående resultat ville det kræve brug af $cond
operator i $sum
akkumulatoroperatør. $cond
operatør vil evaluere en logisk betingelse baseret på dets første argument (hvis) og returnerer derefter det andet argument, hvor evalueringen er sand (derefter), eller det tredje argument, hvor falsk (andet). Dette konverterer den sande/falske logik til 1 og 0 numeriske værdier, der føres ind i $sum
henholdsvis:
"success_count": {
"$sum": {
"$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
}
}
Som en resulterende pipeline skal man køre aggregeringsoperationen, som bruger $dateToString
operator i _id
nøgleudtryk for $gruppe
pipeline:
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);
})
Der er dog en mere fleksibel og bedre ydende tilgang, som eksekverer meget hurtigere end ovenstående, hvor den mest effektive datastruktur for dit aggregeringsresultat følger skemaet for eksempel:
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 }
]
}
]
Overvej derefter at køre en alternativ pipeline som følger
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);
})