【问题标题】:Node.js + Mongoose.js How to get sum of orders are placed in a month or a week?Node.js + Mongoose.js 如何获取一个月或一周的订单总和?
【发布时间】:2014-07-18 16:24:36
【问题描述】:

我找到了聚合框架,但是如何在一个月或一周内获得文档?我想计算一周或一个月内下了多少订单。文件是这样的:

{
    "_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);
    }
});

【问题讨论】:

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


    【解决方案1】:

    如果您只想要一个时间段内的总订单,那么您可以使用$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 运算符在给定范围内的每一天对所有值进行分组。

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

    【讨论】:

    • 我复制了 createdDate 的值并直接粘贴到代码中。但我没有得到任何数据。请查看更新后的问题。
    • @yongho 我看到了你的编辑。这些是字符串而不是日期类型。那不是我在答案中写的。像我一样使用Date 对象构造函数。我也没有故意粘贴整个字符串,因为您希望查询中的起始(零小时零分钟等)日期值
    • 我一开始尝试使用新日期,但不起作用,然后我复制了该值。而且我看到其他人正在复制日期字符串。我认为它会起作用。
    • @yongho 不要复制整个字符串。像我一样做。正如我所展示的那样,“年月日”。相信我,它有效。
    • 我得到空数组。只是 [] 在控制台中。请参阅更新的问题。而且, Model.find 部分有效。为什么聚合部分不起作用。
    猜你喜欢
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多