まず、フィールドvoteType
を追加します 各投票で。このフィールドはそのタイプを示します。このフィールドがあるので、投票を2つの別々の配列mlVoters
に保持する必要はありません。 およびegVoters
;代わりに、これらの配列をドキュメントごとに1つの配列に連結し、後で巻き戻すことができます。
この時点で、投票ごとに1つのドキュメントがあり、それがどのタイプであるかを示すフィールドがあります。ここで、電子メールでグループ化する必要があります。グループ化の段階で、2つの条件付き合計を実行して、すべての電子メールにある各タイプの投票数をカウントします。
最後に、フィールドtotalCount
を追加します 他の2つのカウントの合計として。
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"]
}
}
}
])