【问题标题】:mongodb - want to sum values over timemongodb - 想要随着时间的推移对值求和
【发布时间】:2016-06-23 17:47:34
【问题描述】:

我在 Mongo 中有一堆代表销售交易的文件 - 每笔交易一份文件。在每个文件中,我都有交易的价值和日期和时间。我想运行一个查询来总结每天所有交易的总价值。

我查看了聚合框架,但找不到任何使用时间戳/日期进行过滤的示例。谁能给我一些关于如何做到这一点的指示?

【问题讨论】:

  • 你能展示示例 JSON 文档吗?

标签: mongodb mongodb-query


【解决方案1】:

聚合框架是正确的方向。

在使用聚合之前,让我们准备一些数据:

var data = [
    {
        value: 10,
        dateTime: ISODate("2016-06-01T06:00:00.000Z")
    },{
        value: 20,
        dateTime: ISODate("2016-06-01T08:00:00.000Z")
    },{
        value: 30,
        dateTime: ISODate("2016-06-02T06:00:00.000Z")
    },{
        value: 40,
        dateTime: ISODate("2016-06-02T08:00:00.000Z")
    },{
        value: 50,
        dateTime: ISODate("2016-06-03T06:00:00.000Z")
    },{
        value: 60,
        dateTime: ISODate("2016-06-03T08:00:00.000Z")
    },
];

db.saleTransaction.insert(data);

我们现在有 6 条销售交易记录,每天 2 条记录。 'value' 字段是一个数字,'dateTime' 字段是一个日期。

日期字段可以通过 $gt/$lt/... 运算符进行比较,所以如果你想要 2016-06-01~2016-06-02 的数据,查询就像这个:

{ dateTime: 
        { $gte: ISODate("2016-06-01T00:00:00.000Z"), 
          $lt: ISODate("2016-06-03T00:00:00.000Z")}}
}

然后你可以在汇总之前使用 $match 运算符来过滤它们, 例如,如果你想知道 2016-06-01~2016-06-02 每一天的总值,你可以使用这个查询:

db.saleTransaction.aggregate(
[
    { $match: { dateTime: 
        { $gte: ISODate("2016-06-01T00:00:00.000Z"), $lt: ISODate("2016-06-03T00:00:00.000Z")}}
    },
    {$group: { _id : {
            year:{$year:"$dateTime"},
            month:{$month:"$dateTime"},
            day:{$dayOfMonth:"$dateTime"}
        },
        count:{$sum: "$value" }
    }
}
]);

结果是这样的:

{ "_id" : { "year" : 2016, "month" : 6, "day" : 2 }, "count" : 70 }
{ "_id" : { "year" : 2016, "month" : 6, "day" : 1 }, "count" : 30 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-15
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多