MongoDB时间字段比较

MongoDB 时间字段比较

在实际开发中可能会有这种需求,查询 A 时间大于 B 时间的所有记录

1
SELECT order_no FROM order_info WHERE time1 > time2

在 mysql 中,我们使用上面的 sql 即可,但 mongo 中不支持这种语法,我们可以使用其他的办法,如使用 $where 操作符

1
2
3
db.orderInfo.find({
$where: "this.time1 > this.time2"
})

不过,使用这种方法是不会用到索引的,所以查询效率很慢,所以需要一种更高效的方法,使用聚合操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
db.orderInfo.aggregate([
{
"$project": {
"time1": 1,
"time2": 1,
"diff": {
"$subtract": ["$time1", "$time2"]
}
}
},
{
"$match": {
"diff": {
"$gt": 0
}
}
}
])

先计算 diff 的值,为 time1 - time2 的毫秒数,match 阶段筛选出 diff > 0 的所有记录

在程序中使用 mongoTemplate 查询

1
2
3
4
5
6
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.project("time1", "time2").andExpression("time1 - time2").as("diff"),
Aggregation.match(Criteria.where("diff").gt(0))
);
List<OrderInfo> resultList = mongoTemplate.aggregate(aggregation, OrderInfo.class).getMappedResults();
System.out.println(resultList);