首页 > 解决方案 > 如何在 mongoDB 中按天/月分组?

问题描述

以下是一份文档的外观:

{
    "login_Id": "c",
    "name": "Abhishek Soni",
    "location": "BLAHBLAH",
    "work": [
        {
            "date":ISODate("2014-01-01"),
            "total_time": 100,
        },
        {
            "date":ISODate("2014-09-02"),
            "total_time": 100,
        },
        {
            "date":ISODate("2014-01-01"),
            "total_time": 10,
        },
    ]
}

我想要做的是运行一个查询,它会给出这样的输出:

{login_Id: 'c', work:{'01' : 110, '02': 100, ... and so on}}

基本上,我只想work按月分组。

这是我尝试过的:

db.employees.aggregate([
    {
        "$project": {
            "_id": 0,
            "login_Id": 1,
            "time": {
                "$sum": "$work.total_time"
            }
        }
    },
    {
        "$group": {
            "_id": {
                "$dayOfYear": "$work.date"
            },
            "time": {
                "$sum": "$work.total_time"
            }
        }
    }
]);

但它输出null. 如果我删除 group 子句,我得到总和(即 210) 有什么问题?

标签: mongodbmongodb-queryaggregation-framework

解决方案


您可以尝试以下聚合

db.collection.aggregate([
  { "$unwind": "$work" },
  { "$match": { "work.date": { "$type": "date" }}},
  { "$group": {
    "_id": { "date": { "$dayOfMonth": "$work.date" }},
    "time": { "$sum": "$work.total_time" },
    "login_Id": { "$first": "$login_Id" }
  }},
  { "$group": {
    "_id": "$login_Id",
    "data": {
      "$push": {
        "k": { "$toString": "$_id.date" },
        "v": "$time"
      }
    }
  }},
  { "$project": {
    "work": { "$arrayToObject": "$data" },
    "_id": 0,
    "login_id": "$_id"
  }}
])

输出

[
  {
    "login_id": "c",
    "work": {
      "1": 110,
      "2": 100
    }
  }
]

推荐阅读