सबसे पहले आप एक फ़ील्ड जोड़ें voteType
प्रत्येक वोट में। यह फ़ील्ड इसके प्रकार को इंगित करता है। इस फ़ील्ड के होने पर, आपको वोटों को दो अलग-अलग सरणियों में रखने की आवश्यकता नहीं है mlVoters
और egVoters
; आप इसके बजाय उन सरणियों को प्रति दस्तावेज़ एक सरणी में जोड़ सकते हैं, और बाद में आराम कर सकते हैं।
इस बिंदु पर आपके पास प्रति वोट एक दस्तावेज़ है, एक फ़ील्ड के साथ जो इंगित करता है कि यह किस प्रकार का है। अब आपको बस ईमेल द्वारा समूह बनाने की जरूरत है और, समूह चरण में, दो सशर्त योगों की गणना करने की जरूरत है कि प्रत्येक ईमेल के लिए प्रत्येक प्रकार के कितने वोट हैं।
अंत में आप एक फ़ील्ड जोड़ते हैं totalCount
अन्य दो गणनाओं के योग के रूप में।
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"]
}
}
}
])