首页 > 解决方案 > 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,但无法这样做。

那么任何人都可以帮我实现结果集吗?

标签: mongodbmongodb-queryamazon-dynamodb

解决方案


  • 首先$group通过ruleCategoryand topLevelFilter.id,获取所需的计数和字段
  • 第二个$groupruleCategory总和计数并制作数组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"
        }
      }
    }
  }
])

操场


推荐阅读