mongo时间字段比较

mongo时间字段比较

开心 192 2021-09-20

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

SELECT order_no FROM order_info WHERE time1 > time2

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

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

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

db.orderInfo.aggregate([
    {
        "$project": {
            "time1": 1,
            "time2": 1,
            "diff": {
                "$subtract": ["$time1", "$time2"]
            }
        }
    },
    {
        "$match": {
            "diff": {
                "$gt": 0
            }
        }
    }
])

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

在程序中使用 mongoTemplate 查询

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

# mongo