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);
|