Попробуйте запрос ниже:
db.collection.aggregate([
/** Merge all arrays inside 'users' & push to 'summary' field */
{
$project: {
date: 1,
actionDate: "$actions.actionDate",
summary: {
$reduce: {
input: "$actions.data.users",
initialValue: [],
in: { $concatArrays: ["$$value", "$$this"] },
},
},
},
},
{
$unwind: "$summary",
},
/** Group on 'date' to push data related to same date */
{
$group: {
_id: "$date",
actionDate: {$first: "$actionDate",},
countFemale: {$sum: {$cond: [{$eq: ["$summary.gender", "Female"]},1,0]}},
countMale: {$sum: {$cond: [{$eq: ["$summary.gender", "Male"]},1,0]}},
meanFemaleAge: {$sum: {$cond: [{$eq: ["$summary.gender", "Female"]},"$summary.age",0]}},
meanMaleAge: {$sum: {$cond: [{$eq: ["$summary.gender", "Male"]},"$summary.age",0]}}
}
},
/** Re-create 'meanFemaleAge' & 'meanMaleAge' fields to add mean */
{
$addFields: {
meanFemaleAge: {$cond: [{$ne: ["$meanFemaleAge", 0]},{$divide: ["$meanFemaleAge","$countFemale"]},0]},
meanMaleAge: {$cond: [{$ne: ["$meanMaleAge", 0]},{$divide: ["$meanMaleAge","$countMale"]},0]},
}
}
]);
Тест: MongoDB-Playground
Примечание: Неважно, что как вы это сделаете, я бы посоветовал вам не реализовывать такого рода операции для всей коллекции с огромными наборами данных.