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集合中的createddate字段遵循时间序列(每天创build一个用户),是一个适当的孟戈date,但至less会让你去。

我们先考虑一下聚合pipe道。 由于您希望为指定的数据范围内的每一天生成用户计数列表,因此可以通过在$matchpipe道步骤之后构buildstream水线,使用$group操作符作为组键创build一个string表示使用$dateToString操作符createddate字段,可用于按"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)); });