Đầu tiên, bạn thêm một trường voteType
trong mỗi phiếu bầu. Trường này cho biết loại của nó. Có trường này, bạn không cần phải giữ các phiếu bầu trong hai mảng riêng biệt mlVoters
và egVoters
; thay vào đó, bạn có thể nối các mảng đó thành một mảng duy nhất trên mỗi tài liệu và thư giãn sau đó.
Tại thời điểm này, bạn có một tài liệu cho mỗi phiếu bầu, với một trường cho biết nó thuộc loại nào. Bây giờ bạn chỉ cần nhóm theo email và trong giai đoạn nhóm, thực hiện hai phép tính tổng có điều kiện để đếm xem có bao nhiêu phiếu bầu của mỗi loại cho mỗi email.
Cuối cùng, bạn thêm một trường totalCount
là tổng của hai số còn lại.
db.documents.aggregate([
{
$addFields: {
mlVoters: {
$ifNull: [ "$mlVoters", []]
},
egVoters: {
$ifNull: [ "$egVoters", []]
}
}
},
{
$addFields: {
"mlVoters.voteType": "ml",
"egVoters.voteType": "eg"
}
},
{
$project: {
voters: { $concatArrays: ["$mlVoters", "$egVoters"] }
}
},
{
$unwind: "$voters"
},
{
$project: {
email: "$voters.email",
voteType: "$voters.voteType"
}
},
{
$group: {
_id: "$email",
mlCount: {
$sum: {
$cond: {
"if": { $eq: ["$voteType", "ml"] },
"then": 1,
"else": 0
}
}
},
egCount: {
$sum: {
$cond: {
"if": { $eq: ["$voteType", "eg"] },
"then": 1,
"else": 0
}
}
}
}
},
{
$addFields: {
totalCount: {
$sum: ["$mlCount", "$egCount"]
}
}
}
])