Nodejs mongoose 按日期分组查询问题

发布于 1周前 作者 zlyuanteng 来自 nodejs/Nestjs

Nodejs mongoose 按日期分组查询问题

表的结构:

{
        "point": "625fa3ccd3ebc0de0f1837d9",
        "_id": "625fb7ad9c9d58cdc664fde5",
        "create": "2022-04-20T07:35:09.203Z",
        "update": "2022-04-20T07:35:09.203Z",
        "__v": 0
    }

现在需要按照时间,每分钟统计次数,得到如下 aggregate:

this.reportModel.aggregate([
                {$match: {point:data[0]._id,}},
                {$project: {
                    date1Str: {$dateToString: {format: "%Y-%m-%d %H:%M", date:"$create",timezone:"+08:00"}},
                 }},
                {$group: {_id: "$date1Str", total: {$sum: 1}}},
                {$sort:{_id:1}}
            ]).exec()

查出来的数据,只统计了有数据的日期

[
        {
            "_id": "2022-04-20 14:10",
            "total": 8
        },
        {
            "_id": "2022-04-20 14:11",
            "total": 1
        },
        {
            "_id": "2022-04-20 14:19",
            "total": 1
        },
        {
            "_id": "2022-04-20 14:20",
            "total": 6
        },
        {
            "_id": "2022-04-20 14:25",
            "total": 8
        },
        {
            "_id": "2022-04-20 15:16",
            "total": 1
        },
        {
            "_id": "2022-04-20 15:35",
            "total": 1
        }
    ]

如何实现没有数据的日期自动补 0 ,例如:

[
        {
            "_id": "2022-04-20 14:10",
            "total": 8
        },
        {
            "_id": "2022-04-20 14:11",
            "total": 0
        },
        {
            "_id": "2022-04-20 14:12",
            "total": 0
        },
        {
            "_id": "2022-04-20 14:11",
            "total": 1
        },
        ...
]


7 回复

我的理解是需要先在程序里初始化一些没有数据的日期范围吧?不然数据库也无法知道“没有数据的日期”是什么。


标记一下,也遇到了这个问题。

这个不应该在 mongoose 上做 应该在 js 代码自己补一下

很像 mysql 的分组统计问题,mysql 是先搞出日期表作为主表,join 分组后的表,如果 null 设置 0

觉得这种场景在后端程序来的更快捷,后端一次循环,免去一大段 sql

感谢回答

那这样在 service 层处理一下

在Node.js中使用Mongoose进行按日期分组查询时,通常会涉及到MongoDB的聚合管道。以下是一个简单的示例,展示如何按日期分组查询数据。

假设你有一个名为Event的模型,其中包含datevalue字段。你希望按日期分组并计算每个日期的value总和。

首先,确保你已经定义了Event模型:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const eventSchema = new Schema({
  date: Date,
  value: Number
});

const Event = mongoose.model('Event', eventSchema);

然后,使用Mongoose的聚合管道进行按日期分组查询:

Event.aggregate([
  {
    $group: {
      _id: { $dateToString: { format: "%Y-%m-%d", date: "$date" } },
      totalValue: { $sum: "$value" }
    }
  },
  {
    $sort: { _id: 1 }
  }
], (err, results) => {
  if (err) {
    console.error(err);
  } else {
    console.log(results);
  }
});

在这个例子中,$group阶段使用$dateToString将日期转换为字符串格式(例如YYYY-MM-DD),并计算每个日期的value总和。$sort阶段按日期升序排序结果。

请注意,$dateToString需要MongoDB 3.0及以上版本支持。如果你使用的是更早的版本,可能需要其他方法来实现日期格式化。

回到顶部