在嵌套数组中包含组和项目的MongoDB聚合集合
我在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":
{
"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"
}
}
}}
])