是否可以获取每个运动类别的付款金额? 不仅限于“约翰”,而且在所有催缴文件中也是如此。
所提供数据的预期查询返回:
{
{"Fight": [100,95] },
{"Running": [50] }
}
数据示例:
{"_id":"5z621578b0ce483b9866fb1f",
"Name":"John",
"Sports":[
{"Category":"Fight",
"Billing":[
{"Month":"Jan",
"Status":"Paid",
"Price":100},
{"Month":"Feb",
"Status":"Not Paid",
"Price":125},
{"Month":"Mar",
"Status":"Paid",
"Price":95}
]
},
{"Category":"Running",
"Billing":[
{"Month":"Jan",
"Status":"Not Paid",
"Price":200},
{"Month":"Feb",
"Status":"Paid",
"Price":50}
]
}
]
}
换句话说:我需要比较每个嵌套对象内的计费状态,并检查其是否为“付费” ,然后如果为true,则分别添加计费对象价格添加到相应运动类别的数组中。
对于集合中的所有文档,具有多个运动类别和多个计费月份。但总是相同的嵌套结构。
提前谢谢!
答案 0 :(得分:0)
正如willis在其评论中所说,您将要使用连词: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'} }
]);