【发布时间】:2016-06-23 17:47:34
【问题描述】:
我在 Mongo 中有一堆代表销售交易的文件 - 每笔交易一份文件。在每个文件中,我都有交易的价值和日期和时间。我想运行一个查询来总结每天所有交易的总价值。
我查看了聚合框架,但找不到任何使用时间戳/日期进行过滤的示例。谁能给我一些关于如何做到这一点的指示?
【问题讨论】:
-
你能展示示例 JSON 文档吗?
标签: mongodb mongodb-query
我在 Mongo 中有一堆代表销售交易的文件 - 每笔交易一份文件。在每个文件中,我都有交易的价值和日期和时间。我想运行一个查询来总结每天所有交易的总价值。
我查看了聚合框架,但找不到任何使用时间戳/日期进行过滤的示例。谁能给我一些关于如何做到这一点的指示?
【问题讨论】:
标签: mongodb mongodb-query
聚合框架是正确的方向。
在使用聚合之前,让我们准备一些数据:
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 }
【讨论】: