首页 > 解决方案 > MongoDB 按子组聚合已经按日期分组

问题描述

我有一个 mongo 集合,其中包含项目并像这样表示(小样本):

{
    {
        "_id" : ObjectId("5c615f9141d6ec562be9fd4d"),
        "title" : "Project1",
        "_created" : ISODate("2019-02-11T11:42:09Z"),
        "org" : [
            "ORG1"
        ]
    }
    {
        "_id" : ObjectId("5cf4ec11362a5f02b74effd3"),
        "title" : "Project2",
        "org" : [
            "ORG2"
        ],
        "_created" : ISODate("2018-06-03T09:44:49Z")
    }
    {
        "_id" : ObjectId("5d0362eb362a5f488a315508"),
        "title" : "Another Project",
        "org" : [
            "ORG3"
        ],
        "_created" : ISODate("2019-06-14T09:03:39Z")
    }
    {
        "_id" : ObjectId("5d0362eb362a5f488a315508"),
        "title" : "Multi Org Project",
        "org" : [
            "ORG1",
            "ORG3"
        ],
        "_created" : ISODate("2018-06-14T09:03:39Z")
    }
}

我想做的是通过时间间隔(例如$day/$month/$year)知道在每个组织(org)中创建的项目数量。

我正在努力在 mongo 聚合中做到这一点。

我成功地做到了:

db.projects.aggregate({$group:{_id:{$year: "$_created"}, project:{$sum:1}}}) 
db.projects.aggregate([{$unwind:"$org"}, {$group:{_id: "$org", project: {$sum:1}}}])

但是如何将两者结合起来?我不想强制任何结果格式,但他会是这样的:

{
    2017: {
        "ORG1": 12,
        "ORG2": 3,
    },
    2018...
}

我发现了很多关于 MongoDB 聚合框架的问题,但我仍然不明白。

谢谢你的帮助!

标签: mongodbaggregation-framework

解决方案


展开您的 org 数组,然后分组两次以实现此目的:

db.collection.aggregate([
  {
    $unwind: "$org"
  },
  {
    $group: {
      _id: {
        year: {
          $year: "$_created"
        },
        org: "$org"
      },
      count: {
        $sum: 1
      }
    }
  },
  {
    $group: {
      _id: "$_id.year",
      res: {
        $addToSet: {
          org: "$_id.org",
          count: "$count"
        }
      }
    }
  },
])

将输出

[
  {
    "_id": 2018,
    "res": [
      {
        "count": 1,
        "org": "ORG1"
      },
      {
        "count": 1,
        "org": "ORG3"
      },
      {
        "count": 2,
        "org": "ORG2"
      }
    ]
  },
  {
    "_id": 2019,
    "res": [
      {
        "count": 1,
        "org": "ORG2"
      },
      {
        "count": 1,
        "org": "ORG1"
      },
      {
        "count": 1,
        "org": "ORG3"
      }
    ]
  }
]

如果需要,您可以添加更多阶段来重塑您的文档。

蒙古游乐场


推荐阅读