Dzięki frameworkowi agregacji wynik będzie nieco inny niż "pożądany" wynik, ponieważ zamiast kluczy mieszających otrzymasz tablicę obiektów z _id
klucz o wartości reprezentującej grupowanie według pola. Na przykład zamiast
{
"28-10-2016":{
"success_count": 10,
"failure_count": 10
},
"29-10-2016": {
"success_count": 10,
"failure_count": 10
}
}
będziesz miał lepszą strukturę, jak
[
{
"_id": "28-10-2016",
"success_count": 10,
"failure_count": 10
},
"_id": "29-10-2016",
"success_count": 10,
"failure_count": 10
}
]
Osiągnięcie powyższego wyniku wymagałoby użycia $cond
operator w $sum
operator akumulatora. $cond
Operator oceni warunek logiczny na podstawie jego pierwszego argumentu (jeśli), a następnie zwróci drugi argument, gdy ocena jest prawdziwa (wtedy), lub trzeci argument, jeśli fałsz (inaczej). To konwertuje logikę prawda/fałsz na wartości liczbowe 1 i 0, które są przesyłane do $sum
odpowiednio:
"success_count": {
"$sum": {
"$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
}
}
Jako wynikowy potok należy uruchomić operację agregacji, która używa $dateToString
operator w _id
wyrażenie klucza dla $grupa
potok:
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);
})
Istnieje jednak bardziej elastyczne i wydajniejsze podejście, które działa znacznie szybciej niż powyższe, gdzie najbardziej wydajna struktura danych dla wyniku agregacji jest zgodna ze schematem, na przykład:
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 }
]
}
]
Następnie rozważ uruchomienie alternatywnego potoku w następujący sposób
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);
})