在嵌套数组中包含组和项目的MongoDB聚合集合

在嵌套数组中包含组和项目的MongoDB聚合集合,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我在mongodb中有一个集合,其结构如下: { "RuleSetId": "5bfd3c25fe29a81aa42a3972", "MachineName": "HDHX1090", "IsCompliant": "False", "InfoDate": ISODate("2019-09-15T23:14:22.032+0000") }, { "RuleSetId": "5bfd3c25fe29a81aa42a3972", "MachineName":

我在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")
}
说明: 将有有限的规则集ID(15到20),每个规则集ID可以有n个数的MachineName在单个InfoDate上符合“True”或“False”,相同的可以在不同的InfoDate上重复。

现在我想对“RuleSetId”“MachineName”“InfoDate”列进行分组,并基于“IsCompliant”值应用“count”,我希望结果输出如下所示:

{ 
   "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的聚合方法来实现这一点,或者您将建议一些不同的方法来实现它


提前感谢Rajiv,您可以使用下面的聚合

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"
      }
    }
  }}
])