mongodb - Mongodb聚合和嵌套分组
问题描述
我有以下 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()
portfolio
我想在 的基础上创建另一个嵌套组topLevelFilter.id
并计算 的总和summaryStatus
,但无法这样做。
那么任何人都可以帮我实现结果集吗?
解决方案
- 首先
$group
通过ruleCategory
andtopLevelFilter.id
,获取所需的计数和字段 - 第二个
$group
和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"
}
}
}
}
])
推荐阅读
- django - Django & intercooler.js : 使用 Intercooler.js 将变量传递给视图
- amazon-web-services - 无法制作 S3 对象,使用 Lambda 从另一个账户上的 S3 存储桶复制,公共
- javascript - 我正在尝试将 JSON 对象发布到 ASP.NET MVC 控制器但得到空 JSON
- python - SMTPAuthenticationError: (535, b'5.7.8 用户名和密码不被接受。了解详情\n5.7.8 https://support.google
- magento - Magento 1.9:获取产品 X 是追加销售的产品
- exception - 为什么要在异常中使用多个捕获?
- windows - windows Jenkins上的groovy命令curl
- hyperledger-fabric - 在 Hyperledger Fabric 中,客户端是向所有订单发送交易还是仅向一个订购者节点发送交易?
- c# - 无法将 int 类型隐式转换为 (namespace.model.class) 类型
- python - 如何用另一个数据框中最接近的日期填充一个数据框中的日期列