我想在我的 Mongoose 聚合中输入一个开始日期和一个结束日期,以获取该范围内每一天的注册用户。我知道我可以使用普通的计数函数,但我认为最好使用聚合函数,您怎么看?
var startDate = 2016-01-05;
var endDate = 2016-01-07;
history : [
['2016-01-05', 23], // Day 1 = 23 Users
['2016-01-06', 34], // Day 2 = 34 Users
['2016-01-07', 43] // Day 3 = 43 Users
];
所以我正在寻找类似的东西
User.aggregate(
[
{
“$组”:{
“创建”:{
$gte: 开始日期,
$lt: 结束日期
}
}
}
], 函数(错误,用户){
历史推送(用户);
}
);
最佳答案
聚合确实是理想的解决方案,但它生成结果的方式与您的预期输出不同,具体取决于您的应用程序需求(我认为您很可能想使用此数据 显示在图表中)。
您可以通过多种方式解决这个问题。不是最好的解决方案,因为它取决于您的数据结构,即它假设 users
集合中的 created
日期字段遵循时间序列(每天创建一个用户) 并且是一个合适的 mongo 约会,但至少会让你前进。
让我们首先考虑聚合管道。由于您想要生成指定数据范围内每一天的用户计数列表,您可以构建
您的管道在 $match
之后 管道步骤,使用 $group
运算符使用 $dateToString
创建 created
日期字段的字符串表示形式作为组键 运算符,可用于按 "YYYY-MM-DD"
格式的日期进行分组。然后使用 $sum
获取每个累积文档的计数
运算符(operator):
var startDate = new Date("2016-01-05");
var endDate = new Date("2016-01-08");
var pipeline = [
{
"$match": {
"created": {
"$gte": startDate,
"$lt": endDate
}
}
},
{
"$group": {
"_id": {
"yearMonthDay": {
"$dateToString": {
"format": "%Y-%m-%d",
"date": "$created"
}
}
},
"count": { "$sum": 1 }
}
}
];
然后您可以运行聚合管道,操作结果以获得所需格式的最终数组:
User.aggregate(pipeline, function (err, users){
if (err) {/* handle error */ }
console.log(JSON.stringify(users, null, 4));
var data = users.map(function (u){ return [u._id.yearMonthDay, u.count]; });
console.log(JSON.stringify(data, null, 4));
});
关于node.js - Mongoose 获取具有值的日期数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34668377/