This question already has answers here:
Group result by 15 minutes time interval in MongoDb

(5 个回答)


4年前关闭。




我使用 nodejs 和 mongodb 作为数据库

我的文件是:
{
    "_id": "58466d6a0b3f4d2e2fa22905",
    "updatedAt": "2016-12-06T07:48:58.435Z",
    "createdAt": "2017-12-06T07:48:58.435Z",
    "userId": "56d04e265a2100c72a311334",
    "__v": 0
  }

用户将在客户端给出 fromDate 、toDate 和频率,其中频率值可以是 0,1,2
其中 0 表示日,1 表示周,2 表示年。

根据上述数据,我想生成报告

例如:如果用户提供 fromDate=2016-12-1 和 toDate=2016-12-6。

如果频率为 0 结果将是
{
  2016-12-01:{
    count:1
          }
  2016-12-02:{
      count:7
        }
  2016-12-06:{
      count:8
      }
  }

如果频率为 1 结果将是
{
  2016-12-01 to 2016-12-06:{
    count:16
          }
  }

如果频率为 2 结果将是
{
  2016:{
    count:16
          }
  }

其中count是文档数

我这样做了:
var aggregate = [{
        $match: {
            createdAt: {
                $gte: fromDate,
                $lt: toDate
            }
        }
    }, {
        $group: {
            // what should i will do here
            },
            count: {
                $sum: 1
            }
        }
    }]

    return LoginReportModel.aggregate(aggregate).exec();

或任何人都知道其他更好的方法,例如使用 lodash 也欢迎

最佳答案

查看 $dateToString 上的文档

你可以这样做:

var frequency = 2

var frequencyDateFormatMap = {
  0: '%Y-%m-%d',
  1: '%U',
  2: '%Y'
}

var frequencyDateFormat = frequencyDateFormatMap[frequency]

var aggregate = [
  {$match: {
    createdAt: {
      $gte: fromDate,
      $lt: toDate
    }
  }},
  {$project: {
    frequency: {
      $dateToString: {
        format: frequencyDateFormat,
        date: '$createdAt'
      }
    }
  }},
  {$group: {
    _id: '$frequency',
    count: {
      $sum: 1
    }
  }}
]

return LoginReportModel.aggregate(aggregate).exec()

关于node.js - Mongoose 按天、周、年聚合分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40994888/

10-11 09:34