This question already has answers here:
Group result by 15 minutes time interval in MongoDb
(5 个回答)
4年前关闭。
我使用 nodejs 和 mongodb 作为数据库
我的文件是:
用户将在客户端给出 fromDate 、toDate 和频率,其中频率值可以是 0,1,2
其中 0 表示日,1 表示周,2 表示年。
根据上述数据,我想生成报告
例如:如果用户提供 fromDate=2016-12-1 和 toDate=2016-12-6。
如果频率为 0 结果将是
如果频率为 1 结果将是
如果频率为 2 结果将是
其中count是文档数
我这样做了:
或任何人都知道其他更好的方法,例如使用 lodash 也欢迎
(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