Trong quy trình tổng hợp, đối với MongoDB phiên bản 3.6 và mới hơn, bạn có thể tận dụng việc sử dụng $arrayToObject
toán tử và $replaceRoot
để có được đầu ra JSON mong muốn. Điều này hoạt động tốt đối với các giá trị không xác định của trường cuộc gọi.
Bạn sẽ cần chạy đường dẫn tổng hợp sau:
db.collection.aggregate([
{ "$group": {
"_id": {
"name": "$name",
"call": "$call"
},
"count": { "$sum": 1 }
} },
{ "$group": {
"_id": "$_id.name",
"counts": {
"$push": {
"k": "$_id.call",
"v": "$count"
}
},
"nameCount": { "$sum": 1 }
} },
{ "$replaceRoot": {
"newRoot": {
"$mergeObjects": [
{ "$arrayToObject": "$counts" },
"$$ROOT"
]
}
} },
{ "$project": { "counts": 0 } }
])
Đối với các phiên bản MongoDB cũ hơn không hỗ trợ các toán tử ở trên, hãy tận dụng $cond
toán tử trong $group
giai đoạn để đánh giá số lượng dựa trên call
đã biết giá trị, giống như sau:
db.collection.aggregate([
{ "$group": {
"_id": "$name",
"nameCount": { "$sum": 1 },
"Success Call": {
"$sum": {
"$cond": [ { "$eq": [ "$call", "Success Call" ] }, 1, 0]
}
},
"Repeat Call": {
"$sum": {
"$cond": [ { "$eq": [ "$call", "Repeat Call" ] }, 1, 0]
}
},
"Unsuccess Call": {
"$sum": {
"$cond": [ { "$eq": [ "$call", "Unsuccess Call" ] }, 1, 0]
}
}
} },
{ "$project": {
"_id": 0,
"name": "$_id",
"nameCount": 1,
"Success Call":1,
"Unsuccess Call":1,
"Repeat Call":1
} }
])