Mongoose获取Date的数组
我想input一个startDate和一个endDate到我的Mongoose Aggregation来获取注册用户在该范围之间的foreach天。 我知道我可以使用正常的计数function,但我认为它更好地使用它的聚合,你觉得呢?
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); } );
聚合确实是理想的解决scheme,但是它如何生成结果与您的预期输出有所不同,具体取决于您的应用程序需求(我认为您可能希望将这些数据用graphics显示)。
你可以通过几种方法来解决这个问题。 不是最好的解决scheme,因为它取决于你的数据的结构,即它假设你的users
集合中的created
date字段遵循时间序列(每天创build一个用户),是一个适当的孟戈date,但至less会让你去。
我们先考虑一下聚合pipe道。 由于您希望为指定的数据范围内的每一天生成用户计数列表,因此可以通过在$match
pipe道步骤之后构buildstream水线,使用$group
操作符作为组键创build一个string表示使用$dateToString
操作符created
date字段,可用于按"YYYY-MM-DD"
格式对date进行分组。 然后使用$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 } } } ];
然后可以运行聚合pipe道,操作结果以获得所需格式的最终数组:
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)); });