【问题标题】:Mongoose: How to get the past 7 days upload data statistics from DB?Mongoose:如何从数据库中获取过去 7 天的上传数据统计信息?
【发布时间】:2021-11-01 04:47:26
【问题描述】:

在用户文档中,我已经注册了用户。我想通过 API 显示过去 7 天的统计数据。第一天 - 7 个用户,第 2 天 - 5 个用户,第 3 天 - 3 个用户...... UserSchema 包含名称、电子邮件、createdAt 等。我如何在 Mongodb/mongoose 中做到这一点?

样本数据:

    {
        "_id": "612fa439ddb04331d6ea1e5d",
        "name": "imran-1630512185253",
        "createdAt": "2021-09-01T16:03:05.266Z",
    },
     {
        "_id": "612fa439ddb04331d6ea1e5d",
        "name": "imran-1630512185253",
        "createdAt": "2021-08-31T16:03:05.266Z",
    },
    ...........

预期输出:

    "filterData" : {
        1st day: 3,
        2nd day: 5,
        3rd day: 3,
        4th day: 8,
        ...
     }

使用这个 API,我想创建一个图表来显示统计数据。该 API 应提供在哪一天创建了多少用户。

【问题讨论】:

  • 提供样本数据,以及您预期输出的样本
  • 更新了,能再查一下吗?
  • 从今天起 7 天还是过去 7 天?
  • 从今天起过去 7 天

标签: node.js mongodb express mongoose


【解决方案1】:

你可以这样做

var d = new Date();
d.setDate(d.getDate()-7);

然后

users.find({"createdAt": { $gt: d }})

【讨论】:

  • 使用这个API,我想创建一个图表来显示统计数据。这应该提供哪一天,创建了多少用户。
【解决方案2】:

您描述的查询是按天对一系列文档进行分组,这些文档包含 UTC 日期时间。

MongoDB 在内部将日期/时间存储为自 1970 年 1 月 1 日以来的毫秒数,因此第一步需要计算每个文档的开始日期,然后按该开始日期值分组。

如果您使用的是 MongoDB 5.0,则可以使用 $dateTrunc 运算符:

{$dateTrunc:{date:"$createdAt",unit:"day",timezone:"America/New_York"}}

对于旧版本,您可以计算表示一天开始的日期对象,也可以构建一个仅包含日期的字符串。

对于字符串选项:

{$concat: [
   {$toString:{$year:{ date:"$createdAt", timezone:"America/New_York" }}},
   "-",
   {$toString:{$month:{ date:"$createdAt", timezone:"America/New_York" }}},
   "-",
   {$toString:{$dayOfMonth:{ date:"$createdAt", timezone:"America/New_York" }}},
]}

所以总体而言,聚合管道将是:

  • $match 在所需时间范围内选择文档
  • $project 计算每个文档的开始日期
  • $group 按一天的开始,计算出现次数
  • 将文档转换为所需格式的进一步阶段

【讨论】:

    猜你喜欢
    • 2019-10-04
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多