Pertama, Anda menambahkan bidang voteType
dalam setiap pemungutan suara. Bidang ini menunjukkan jenisnya. Memiliki bidang ini, Anda tidak perlu menyimpan suara dalam dua larik terpisah mlVoters
dan egVoters
; Anda dapat menggabungkan array tersebut menjadi satu array per dokumen, dan bersantai setelahnya.
Pada titik ini Anda memiliki satu dokumen per suara, dengan bidang yang menunjukkan jenisnya. Sekarang Anda hanya perlu mengelompokkan melalui email dan, di tahap grup, lakukan dua penjumlahan bersyarat untuk menghitung berapa banyak suara dari setiap jenis yang ada untuk setiap email.
Akhirnya Anda menambahkan bidang totalCount
sebagai jumlah dari dua hitungan lainnya.
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"]
}
}
}
])