我想在我的Mongoose Aggregation中输入startDate和endDate,以便在该范围之间获得注册用户的前一天。我知道我可以使用正常计数功能,但我认为更好地使用聚合它你觉得怎么样?
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(
[
{
"$group": {
"created": {
$gte: startDate,
$lt: endDate
}
}
}
], function (err, users) {
history.push(users);
}
);
答案 0 :(得分:1)
聚合确实是理想的解决方案,但它如何生成结果与您的预期输出不同,具体取决于您的应用程序需求(我认为您最有可能想要使用此数据) 显示在图表中。
你可以通过几种方式解决这个问题。不是最好的解决方案,因为它取决于您的数据的结构,即它假设您的created
集合中的users
日期字段遵循时间序列(每天创建用户)并且是正确的mongo约会,但至少会让你前进。
让我们先考虑聚合管道。由于您希望在指定的数据范围内生成每天的用户计数列表,因此您可以构建
您的管道在 $match
管道步骤之后,使用 $group
运算符创建组密钥的字符串表示形式使用 $dateToString
运算符的created
日期字段,可用于按"YYYY-MM-DD"
格式分组一天。然后使用 $sum
获取每个累积文档的计数
操作者:
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));
});