mongodb - 想要随时间推移加总值

时间:2016-06-22 13:29:35

标签: mongodb mongodb-query

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

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

1 个答案:

答案 0 :(得分: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'字段是Date。

日期字段可以通过 $ 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 }