Mongodb Mongo中的聚合和分组

Mongodb Mongo中的聚合和分组,mongodb,Mongodb,如何在Mongo中获得摘要计数。我有以下记录结构,我想按日期和状态获得摘要 { "_id": "1", "History": [ { "id": "11", "message": "", "status": "send", "resultCount": 0, "createdDate": "", "modifiedDate": "" }, { "id": "21", "

如何在Mongo中获得摘要计数。我有以下记录结构,我想按日期和状态获得摘要

{
  "_id": "1",
  "History": [
    {
      "id": "11",
      "message": "",
      "status": "send",
      "resultCount": 0,
      "createdDate": "",
      "modifiedDate": ""
    },
    {
      "id": "21",
      "message": "",
      "status": "skipped",
      "resultCount": 0,
      "createdDate": "",
      "modifiedDate": ""
    }
  ]
}
这就是我想要的

 date x

    status : 

    count : nn

这是我的Mongo结构

假设您在“历史”集合中有以下数据:

{
  "_id": "1",
  "History": [
    {
      "id": "21",
      "message": "",
      "status": "send",
      "resultCount": 0,
      "createdDate": "date1",
      "modifiedDate": ""
    },
    {
      "id": "22",
      "message": "",
      "status": "skipped",
      "resultCount": 0,
      "createdDate": "date1",
      "modifiedDate": ""
    },
    {
      "id": "23",
      "message": "",
      "status": "skipped",
      "resultCount": 0,
      "createdDate": "date2",
      "modifiedDate": ""
    },
    {
      "id": "24",
      "message": "",
      "status": "skipped",
      "resultCount": 0,
      "createdDate": "date2",
      "modifiedDate": ""
    }
  ]
}
您可以按照以下方式设计查询以获得所需的摘要

db.history.aggregate([
    {
        $unwind:"$History"
    },
    {
        $group:{
            "_id":{
                "createdDate":"$History.createdDate",
                "status":"$History.status"
            },
            "createdDate":{
                $first: "$History.createdDate"
            },
            "status":{
                $first:"$History.status"
            },
            "count":{
                $sum:1
            }
        }
    },
    {
        $group:{
            "_id":"$createdDate",
            "createdDate":{
                $first:"$createdDate"
            },
            "info":{
                $push:{
                    "status":"$status",
                    "count":"$count"
                }
            }
        }
    },
    {
        $project:{
            "_id":0
        }
    }
]).pretty()
这将导致以下结果:

{
    "createdDate" : "date1",
    "info" : [
        {
            "status" : "skipped",
            "count" : 1
        },
        {
            "status" : "send",
            "count" : 1
        }
    ]
}
{
    "createdDate" : "date2",
    "info" : [
        {
            "status" : "skipped",
            "count" : 2
        }
    ]
}
聚合阶段详细信息:

  • 第一阶段:“历史”数组是无意的,即数组将被拆分,每个元素将创建一个单独的文档
  • 第二阶段:根据“createdDate”和“status”对数据进行分组。在此阶段,还将计算状态计数
  • 第三阶段:数据在“createdDate”的基础上进一步分组 只有
  • 第四阶段:从结果中删除非必填字段