【问题标题】:MongoDB aggregate collection with group and project in nested array嵌套数组中包含组和项目的 MongoDB 聚合集合
【发布时间】:2019-09-18 17:57:01
【问题描述】:

我在 mongodb 中有一个具有以下结构的集合:

{ 
   "RuleSetId": "5bfd3c25fe29a81aa42a3972",
   "MachineName": "HDHX1090",
   "IsCompliant": "False",
   "InfoDate": ISODate("2019-09-15T23:14:22.032+0000")
},
{ 
   "RuleSetId": "5bfd3c25fe29a81aa42a3972",
   "MachineName": "HDHX2045",
   "IsCompliant": "True",
   "InfoDate": ISODate("2019-09-15T23:14:22.032+0000")
},
{ 
   "RuleSetId": "5bfd3c25fe29a81aa42a3972",
   "MachineName": "NDEN1295",
   "IsCompliant": "False",
   "InfoDate": ISODate("2019-09-15T23:12:22.032+0000")
},
{ 
   "RuleSetId": "5bfd3c25fe29a81aa42a3972",
   "MachineName": "HDHX1090",
   "IsCompliant": "True",
   "InfoDate": ISODate("2019-08-13T23:14:22.032+0000")
},
{ 
   "RuleSetId": "5bfd3c25fe29a81aa42a3972",
   "MachineName": "HDHX2045",
   "IsCompliant": "True",
   "InfoDate": ISODate("2019-08-13T23:14:22.032+0000")
},
{ 
   "RuleSetId": "5bfd3c25fe29a81aa42a3972",
   "MachineName": "NDEN1295",
   "IsCompliant": "True",
   "InfoDate": ISODate("2019-08-13T23:12:22.032+0000")
},
{ 
   "RuleSetId": "5bfe7ef4ed244b1d48fdaaeb",
   "MachineName": "HDHN1285",
   "IsCompliant": "False",
   "InfoDate": ISODate("2019-05-30T23:14:24.300+0000")
},
{ 
   "RuleSetId": "5bfe7ef4ed244b1d48fdaaeb",
   "MachineName": "HDHX1090",
   "IsCompliant": "False",
   "InfoDate":ISODate("2019-05-30T23:14:24.300+0000")
},
{ 
   "RuleSetId": "5bfe91b3ed244b1d48fdabcb",
   "MachineName": "HDHW2455",
   "IsCompliant": "False",
   "InfoDate": ISODate("2019-05-30T22:14:23.652+0000")
}

说明: 将有有限的 RuleSetId(15 到 20),并且针对每个 RuleSetId,在单个 InfoDate 上可以有 n 个具有 IsCompliant “True”或“False”的 MachineName,同样可以在不同的 InfoDate 上重复。

现在我想在 "RuleSetId""MachineName""InfoDate" 列上分组并应用 "count" > 基于 "IsCompliant" 值,我希望结果输出应如下所示:

{ 
   "RuleSetId":"5bfd3c25fe29a81aa42a3972",
   "History":[ 
      { 
         "InfoDate":"2019-09-15",
         "CompliantCount":1,
         "NonCompliantCount":2
      },
      { 
         "InfoDate":"2019-08-13",
         "CompliantCount":3,
         "NonCompliantCount":0
      }
   ]
},
{ 
   "RuleSetId":"5bfe7ef4ed244b1d48fdaaeb",
   "History":[ 
      { 
         "InfoDate":"2019-05-30",
         "CompliantCount":0,
         "NonCompliantCount":3
      }
   ]
}

是否可以使用 mongodb 的聚合方法来完成此任务,或者您会建议一些不同的方法来完成它?

在此先感谢,拉吉夫

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    你可以使用下面的聚合

    db.collection.aggregate([
      { "$group": {
        "_id": {
          "RuleSetId": "$RuleSetId",
          "InfoDate": { "$dateToString": { "date": "$InfoDate", "format": "%d:%m:%Y" }}
        },
        "CompliantCount": {
          "$sum": { "$cond": [{ "$eq": ["$IsCompliant", "True"] }, 1, 0] }
        },
        "NonCompliantCount": {
          "$sum": { "$cond": [{ "$eq": ["$IsCompliant", "True"] }, 0, 1] }
        }
      }},
      { "$group": {
        "_id": "$_id.RuleSetId",
        "History": {
          "$push": {
            "InfoDate": "$_id.infoDate",
            "NonCompliantCount": "$NonCompliantCount",
            "CompliantCount": "$CompliantCount"
          }
        }
      }}
    ])
    

    【讨论】:

      猜你喜欢
      • 2017-07-26
      • 1970-01-01
      • 2020-11-09
      • 2017-07-16
      • 1970-01-01
      • 2015-12-06
      • 2021-04-19
      • 2021-08-21
      • 2021-06-27
      相关资源
      最近更新 更多