node.js - 用于返回特定日期范围的按日计数的 MongoDB 聚合函数
问题描述
我需要每天获取特定日期范围内的个人用户数量。假设一个月内(1 日至 30 日)总共有 100 个用户,我需要得到这样的计数
{
1st - 2 users
2nd - 10 users
}
MessagesSchema.statics.totalMessagesGraph = (id, startDate, endDate, platform) => {
return Messages.aggregate([
{
$match: {
id: id,
platform: platform,
timestamp: {
$gte: new Date(startDate),
$lte: new Date(endDate)
}
}
}
])
}
什么应该在这里得到想要的结果?
预期结果:
对于该特定日期范围,每天的计数。
{
date1 - 20,
date2 - 22,
date3 - 24,
...
date30 - 12
}
预期的输出应如上所示。之后应该进行什么查询$match
。如果可能,请获取样本数据集并提供输出。
解决方案
例如,使用$group获取每日计数
db.collection.aggregate([
{
$match: {
//id: id,
//platform: platform,
//timestamp: {
//$gte: new Date(startDate),
//$lte: new Date(endDate)
//}
//}
// Your matching logic
},
/* Now grouping users based on _id or id parameter for each day
from the above match results.
$createdAt can be replaced by date property present in your database.
*/
{ $group : {
id : { day: { $dayOfMonth: "$createdAt" },
month: { $month: "$createdAt" },
year: { $year: "$createdAt" } },
count : {$sum : 1}
}
}
])
基于此,您将获得如下输出:
{
"_id" : {
"day" : 14,
"month" : 1,
"year" : 2017
},
"count" : 2.0
}
/* 2 */
{
"_id" : {
"day" : 31,
"month" : 1,
"year" : 2017
},
"count" : 8.0
}
/* 3 */
{
"_id" : {
"day" : 2,
"month" : 1,
"year" : 2017
},
"count" : 4.0
}
...
您可以使用上述查询结果来获得所需的输出。
更准确地说,您可以从组查询中删除月份和年份参数以获得如下输出:
/* 1 */
{
"_id" : {
"day" : 25
},
"count" : 7.0
}
/* 2 */
{
"_id" : {
"day" : 18
},
"count" : 4.0
}
/* 3 */
{
"_id" : {
"day" : 17
},
"count" : 4.0
}
...
作为参考,您可以查看 mongoDB 文档,也可以参考这个。
希望上面的示例可以帮助您获得所需的输出。
推荐阅读
- php - 如何在一列中存储多个值
- ruby-on-rails - Rails 5.2 - 尝试定义枚举时出现 ArgumentError
- jasmine - 如何用 jasmine-karma 覆盖函数的所有行
- linux - linux usb小工具流量监控
- sql - 在 MS ACCESS 替换表中搜索所有相关号码的最简单方法是什么?描述中更好的解释
- typescript - 如何在非静态方法中获取静态属性 - 打字稿
- go - 为什么我的“完成”频道随机关闭?
- windows - Windows 证书交互式登录
- android - 有没有办法在 react-native 应用程序上显示 CPU 和内存使用情况?
- laravel - 将经过身份验证的用户添加到相关模型的最佳方法是什么?