我在Mongo中有一堆代表销售交易的文件 - 每笔交易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 }