Node.js + Mongoose.js如何在一个月或一周内获得订单总和?

时间:2014-05-29 08:10:31

标签: javascript node.js mongodb mongoose aggregation-framework

我找出了汇总框架,但是如何在一个月或一周内获得结果?我想计算一周或一个月内下订单的数量。文件是这样的:

{
    "_id" : ObjectId("53834167b54a3b22f0079e2c"),
    "createdDate" : ISODate("2014-05-26T13:28:07.942Z"),
    "__v" : 0
},
{
    "_id" : ObjectId("53834167b54a3b22f0079e2c"),
    "createdDate" : ISODate("2014-05-28T09:28:07.942Z"),
    "__v" : 0
}

我想要的是根据createdDate在一个月内下达的订单数量。

我正在使用的当前代码:

Order.aggregate([
    { "$match": {
        'createdDate': {
            "$gte": new Date("2014-05-25"), "$lte": new Date("2014-05-27")
        }
    }},
    { "$group": {
        "_id": { "$dayOfYear": "$createdDate" },
        "totalCost": { "$sum": "$totalCost" },
        "sum": {"$sum": 1}
    }}
],
function(err, result) {
    console.log(result);
    if (err) {
        res.send(400, err);
    } else {
        res.send(200, result);
    }
});

1 个答案:

答案 0 :(得分:2)

如果您只想要一段时间内的总订单,那么您可以使用$gte$lt样式运算符在您的日期使用范围查询:

var query = Model.find({ 
    "createdDate": { 
        "$gte": new Date("2014-05-21"), "$lte": new Date("2014-05-29")
    }
}).count()

query.exec(function(err, count) {

如果在该范围内找到文件,那将只返回计数。

如果你想从你的文档内部总结一个值,或者甚至确实检索像"每日总计"从该日期范围内,您可以使用聚合框架来执行此操作:

Model.aggregate([
    { "$match": {
        "$gte": new Date("2014-05-21"), "$lte": new Date("2014-05-29")
    }},
    { "$group": {
        "_id": { "$dayOfYear": "$createdDate" }
        "totalValue": { "$sum": "$orderTotal" }
    }}
],
function(err, result) {

这不仅可以使用$sum运算符来为我们的" orderTotal"添加值。字段,但也使用date aggregation运算符将所有值分组为给定范围内的每一天。

如果最后一种情况符合您的要求,您可以在那里使用各种运算符来分解您希望包含在结果中的各种日期。