Mongoose:如何从DB获取过去7天的上传数据统计?



在用户文档中,我有注册用户。我想通过API显示最近7天的统计数据。第一天- 7个用户,第二天- 5个用户,第三天- 3个用户......UserSchema包含- name, email, createdAt等。我怎么能做到这一点在Mongodb/猫鼬?

样本数据:

{
"_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应该提供哪一天,创建了多少用户。

你可以这样做

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

然后

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

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

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

如果你正在使用MongoDB 5.0,你可以使用$dateTrunc操作符:

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

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

对于字符串选项:

{$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按一天的开始,计算出现的次数
  • 将文件转换为所需格式的进一步阶段

最新更新