Mongodb 聚合和嵌套分组
Mongodb aggregation and nested grouping
我有以下 MongoDB 数据模型:
{
"_id": {
"$oid": "5ffd62eedf2075dfc5a5b0b8"
},
"portfolio": "4086_ClearCreek",
"ruleDescription": "Maximum Moody's Rating Factor Test",
"failureLevel": 3,
"failureCategory": "",
"hasHoldings": true,
"summaryStatus": 0,
"summaryStatusLabel": "Failure",
"ruleType": 1,
"ruleSource": 0,
"ruleValueType": 0,
"testValue": "3673",
"limitValue": "2400",
"limitOperator": "<=",
"testRoom": "-1273",
"numeratorValue": "185278281.19",
"denominatorValue": "680407923070.46",
"ruleCategory": "Collateral Quality",
"topLevelFilter": {
"id": "5fd1bd7868d7ac4e211a7642",
"type": "WSO CMP Dataset",
"name": "Clear Creek CLO, LTD._Clear Creek Test Data Set_Initial"
},
"executionDateTime": "2021-01-12T08:50:54.103"
}
我想看到这样的结果:-
{
"_id" : "Concentration Limitations",
"pass" : 1,
"warn" : 0,
"fail" : 0,
"portfolio" : [
{
"id" : "5fd1bd7868d7ac4e211a7642",
"name" : "Clear Creek CLO, LTD._Clear Creek Test Data Set_Initial",
"pass" : 1,
"warn" : 0,
"fail" : 0
}
]
}
这是我试图实现上述结果集的代码:
db.rule_execution_result.aggregate([{
$group: {
_id: '$ruleCategory',
pass: {
$sum: {
$cond: [{
$eq: ["$summaryStatus", 1]
}, 1, 0]
}
},
warn: {
$sum: {
$cond: [{
$eq: ["$summaryStatus", 2]
}, 1, 0]
}
},
fail: {
$sum: {
$cond: [{
$eq: ['$summaryStatus', 0]
}, 1, 0]
}
},
portfolio: {
$push: {
id: '$$ROOT.topLevelFilter.id',
name: '$$ROOT.topLevelFilter.name',
category: '$$ROOT.ruleCategory',
summary:'$$ROOT.summaryStatus',
pass: '',
warn: '',
fail: ''
}
}
}
}
]).pretty()
我想在topLevelFilter.id
的基础上再做一个portfolio
的嵌套组,计算summaryStatus
的总和,但是做不到
谁能帮我得到结果集?
- 首先
$group
ruleCategory
和topLevelFilter.id
,获取所需的计数和字段
- second
$group
by ruleCategory
并求和计数并制作 portfolio
的数组
db.collection.aggregate([
{
$group: {
_id: {
ruleCategory: "$ruleCategory",
topLevelFilter: "$topLevelFilter.id"
},
name: { $first: "$topLevelFilter.name" },
summaryStatus: { $first: "$summaryStatus" },
pass: { $sum: { $cond: [{ $eq: ["$summaryStatus", 1] }, 1, 0] } },
warn: { $sum: { $cond: [{ $eq: ["$summaryStatus", 2] }, 1, 0] } },
fail: { $sum: { $cond: [{ $eq: ["$summaryStatus", 0]}, 1, 0] } }
}
},
{
$group: {
_id: "$_id.ruleCategory",
pass: { $sum: "$pass" },
warn: { $sum: "$warn" },
fail: { $sum: "$fail" },
portfolio: {
$push: {
id: "$_id.topLevelFilter",
name: "$name",
summary: "$summaryStatus",
pass: "$pass",
warn: "$warn",
fail: "$fail"
}
}
}
}
])
我有以下 MongoDB 数据模型:
{
"_id": {
"$oid": "5ffd62eedf2075dfc5a5b0b8"
},
"portfolio": "4086_ClearCreek",
"ruleDescription": "Maximum Moody's Rating Factor Test",
"failureLevel": 3,
"failureCategory": "",
"hasHoldings": true,
"summaryStatus": 0,
"summaryStatusLabel": "Failure",
"ruleType": 1,
"ruleSource": 0,
"ruleValueType": 0,
"testValue": "3673",
"limitValue": "2400",
"limitOperator": "<=",
"testRoom": "-1273",
"numeratorValue": "185278281.19",
"denominatorValue": "680407923070.46",
"ruleCategory": "Collateral Quality",
"topLevelFilter": {
"id": "5fd1bd7868d7ac4e211a7642",
"type": "WSO CMP Dataset",
"name": "Clear Creek CLO, LTD._Clear Creek Test Data Set_Initial"
},
"executionDateTime": "2021-01-12T08:50:54.103"
}
我想看到这样的结果:-
{
"_id" : "Concentration Limitations",
"pass" : 1,
"warn" : 0,
"fail" : 0,
"portfolio" : [
{
"id" : "5fd1bd7868d7ac4e211a7642",
"name" : "Clear Creek CLO, LTD._Clear Creek Test Data Set_Initial",
"pass" : 1,
"warn" : 0,
"fail" : 0
}
]
}
这是我试图实现上述结果集的代码:
db.rule_execution_result.aggregate([{
$group: {
_id: '$ruleCategory',
pass: {
$sum: {
$cond: [{
$eq: ["$summaryStatus", 1]
}, 1, 0]
}
},
warn: {
$sum: {
$cond: [{
$eq: ["$summaryStatus", 2]
}, 1, 0]
}
},
fail: {
$sum: {
$cond: [{
$eq: ['$summaryStatus', 0]
}, 1, 0]
}
},
portfolio: {
$push: {
id: '$$ROOT.topLevelFilter.id',
name: '$$ROOT.topLevelFilter.name',
category: '$$ROOT.ruleCategory',
summary:'$$ROOT.summaryStatus',
pass: '',
warn: '',
fail: ''
}
}
}
}
]).pretty()
我想在topLevelFilter.id
的基础上再做一个portfolio
的嵌套组,计算summaryStatus
的总和,但是做不到
谁能帮我得到结果集?
- 首先
$group
ruleCategory
和topLevelFilter.id
,获取所需的计数和字段 - second
$group
byruleCategory
并求和计数并制作portfolio
的数组
db.collection.aggregate([
{
$group: {
_id: {
ruleCategory: "$ruleCategory",
topLevelFilter: "$topLevelFilter.id"
},
name: { $first: "$topLevelFilter.name" },
summaryStatus: { $first: "$summaryStatus" },
pass: { $sum: { $cond: [{ $eq: ["$summaryStatus", 1] }, 1, 0] } },
warn: { $sum: { $cond: [{ $eq: ["$summaryStatus", 2] }, 1, 0] } },
fail: { $sum: { $cond: [{ $eq: ["$summaryStatus", 0]}, 1, 0] } }
}
},
{
$group: {
_id: "$_id.ruleCategory",
pass: { $sum: "$pass" },
warn: { $sum: "$warn" },
fail: { $sum: "$fail" },
portfolio: {
$push: {
id: "$_id.topLevelFilter",
name: "$name",
summary: "$summaryStatus",
pass: "$pass",
warn: "$warn",
fail: "$fail"
}
}
}
}
])