Как сказал Уиллис в своем комментарии, вы захотите использовать агрегацию: https://docs.mongodb.com/manual/aggregation/
Следующая агрегация даст вам данные, которые вы ищете (замените счета фактическим именемваша коллекция):
db.billings.aggregate([
{ $unwind: '$Sports'},
{ $unwind: '$Sports.Billing'},
{ $match: { 'Sports.Billing.Status': 'Paid' } },
{
$group: {
_id: '$Sports.Category',
Category: {$first: '$Sports.Category'},
Prices: { $push: '$Sports.Billing.Price' }
}
},
{ $project: {_id: 0} }
]);
Результат этой агрегации будет выглядеть примерно так:
[
{
"Category" : "Running",
"Prices" : [
50.0
]
},
{
"Category" : "Fight",
"Prices" : [
100.0,
95.0
]
}
]
Точный формат, который вы запросили в своем вопросе, немного ненормальный;на мой взгляд, я думаю, что было бы лучше сохранить его в форме агрегации выше результатов.Но если вы хотите получить его в форме, подобной той, которая указана в вашем вопросе, агрегация будет немного более сложной:
db.billings.aggregate([
{ $unwind: '$Sports'},
{ $unwind: '$Sports.Billing'},
{ $match: { 'Sports.Billing.Status': 'Paid' } },
{
$group: {
_id: '$Sports.Category',
Prices: { $push: '$Sports.Billing.Price' }
}
},
{
$group: {
_id: 0,
Sports: { $push: { Category: '$_id', Prices: '$Prices' } }
}
},
{
$project: {
Sports: {
$arrayToObject: {
'$map': {
'input': '$Sports',
'as': 'el',
'in': {
'k': '$$el.Category',
'v': '$$el.Prices'
}
}
}
}
}
},
{ $replaceRoot: { newRoot: '$Sports'} }
]);