Mongoose获取带有值的Date数组

时间:2016-01-08 02:07:30

标签: node.js mongodb mongoose

我想在我的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); } );

1 个答案:

答案 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));
});