Først tilføjer du et felt voteType
ved hver afstemning. Dette felt angiver dens type. Når du har dette felt, behøver du ikke at opbevare stemmerne i to separate arrays mlVoters
og egVoters
; du kan i stedet sammenkæde disse arrays i et enkelt array pr. dokument og slappe af bagefter.
På dette tidspunkt har du ét dokument pr. stemme, med et felt, der angiver, hvilken type det er. Nu skal du blot gruppere via e-mail og i gruppefasen udføre to betingede summer for at tælle hvor mange stemmer af hver type der er for hver e-mail.
Til sidst tilføjer du et felt totalCount
som summen af de to andre tæller.
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"]
}
}
}
])