spring-data-mongodb生成的Query语句order字段顺序错误

前言:

最近在实现一个需求的时候,需求要求查询的数据需要根据播放量倒叙、创建时间倒叙来排序,考虑到播放量、创建时间都有可能是相同的,就会出现排序不稳定的情况,于是就加入了"_id"作为第三个排序字段,在我进行DEBUG的时候,发现Query对象生成的查询语句居然把"_id"作为了第一个排序字段:

1、查询代码:

        Query query = new Query();
        List<Sort.Order> orders = new ArrayList<>();
        orders.add(Sort.Order.desc("aa"));
        orders.add(Sort.Order.desc("bb"));
        orders.add(Sort.Order.asc("_id"));
        query.with(Sort.by(orders));
        System.out.println(SerializationUtils.serializeToJsonSafely(query.getSortObject()));

2、控制台输出的内容:

{ "_id" : 1, "aa" : -1, "bb" : -1 }

3、Debug截图:

 从代码的逻辑上来说,正确的查询语句应该是:

Sort: { "aa" : -1, "bb" : -1,"_id" : 1, }

而我们看到的却是"_id"被提前了:

Sort: { "_id" : 1, "aa" : -1, "bb" : -1 }

原因分析:

1、跟踪代码,看看为什么会生成这样的内容:

1)、在DocumentCodec.beforeFields方法中,如果发现排序的字段中有"_id",则优先写入

2)、在DocumentCodec.skipField方法中,如果发现排序的字段中有"_id",则跳过写入

经过这样一波神操作,我们在使用SerializationUtils.serializeToJsonSafely(query.getSortObject())输出排序字段的JSON格式内容的时候,"_id"字段被调到第一位了。

对查询结果有没有影响?

当我们看到这个Query被生成成这样的时候,心头一紧,咋回事?难度spring-data-mongodb不能实现我的诉求吗?我们来看看最终发送到MongoDB集群里面的语句是什么样子的:

 从上图的DEBUG来看,发送到MongoDB里面的数据是正确的,并没有把“_id”排到第一,后面针对集合里面的数据进行验证,也发现没问题。

结论:

1、“_id”排序在执行的时候没有问题

2、“_id”排序在Query对象生成toString方法中写的有问题,应该是刻意为之,不知道是为什么

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值