Eerst voeg je een veld toe voteType
bij elke stem. Dit veld geeft het type aan. Met dit veld hoeft u de stemmen niet in twee aparte arrays te bewaren mlVoters
en egVoters
; je kunt in plaats daarvan die arrays samenvoegen tot een enkele array per document en daarna ontspannen.
Op dit moment heb je één document per stem, met een veld dat aangeeft om welk type het gaat. Nu hoeft u alleen maar per e-mail te groeperen en in de groepsfase twee voorwaardelijke sommen uit te voeren om te tellen hoeveel stemmen van elk type er zijn voor elke e-mail.
Als laatste voeg je een veld toe totalCount
als de som van de andere twee telt.
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"]
}
}
}
])