【问题标题】:Mongodb aggregation and nested groupingMongodb聚合和嵌套分组
【发布时间】:2021-04-19 08:34:06
【问题描述】:

我有以下 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的总和,但无法这样做。

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

【问题讨论】:

    标签: mongodb mongodb-query amazon-dynamodb


    【解决方案1】:
    • ruleCategorytopLevelFilter.id 的第一个 $group,获取所需的计数和字段
    • 第二个$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"
            }
          }
        }
      }
    ])
    

    Playground

    【讨论】:

      猜你喜欢
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 2023-01-13
      • 2020-11-09
      相关资源
      最近更新 更多