Först lägger du till ett fält voteType
i varje omröstning. Detta fält anger dess typ. Med det här fältet behöver du inte behålla rösterna i två separata arrayer mlVoters
och egVoters
; du kan istället sammanfoga dessa arrayer till en enda array per dokument och koppla av efteråt.
Vid det här laget har du ett dokument per röst, med ett fält som anger vilken typ det är. Nu behöver du helt enkelt gruppera via e-post och, i gruppspelet, utföra två villkorade summor för att räkna hur många röster av varje typ det finns för varje e-postmeddelande.
Slutligen lägger du till ett fält totalCount
som summan av de andra två räknas.
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"]
}
}
}
])