spring-data-mongodb生成的Query语句order字段顺序错误
创始人
2024-01-31 04:01:17
0

前言:

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

1、查询代码:

        Query query = new Query();List 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方法中写的有问题,应该是刻意为之,不知道是为什么

相关内容

热门资讯

“农”墨重彩促振兴・四季画卷绘...   “农”墨重彩促振兴  冬藏回望处,耕耘致岁丰;年轮刻印时,画卷展新程。津沽大地的四季轮回,在冬日...
情绪消费撑起万亿蓝海   最近,“爱你老己”在互联网上走红了。  这个被誉为“年度最暖心的热梗”,反映出当代年轻人“爱自己...
全球最长,中国高铁十万里!   中国高铁运营里程突破5万公里!  高铁发展再上新台阶  临近岁末  中国开通多条高铁线路  进一...
强冷空气来袭,这几类人最危险!...   近日,我国多地出现  大风降温和雨雪天气。  天气“变脸”,  哪些人需要特别当心?  如何做好...
视频丨一条高速串起天山南北 库...   乌尉高速像一条丝带串联起了天山南北,全长324.7公里的乌尉高速公路串联了乌鲁木齐都市圈、北疆城...
现货白银价格一度突破每盎司75...   新华社北京12月26日电 据路透社报道,现货白银价格26日一度突破每盎司75美元,创历史新高。 ...
快递行业向“新”向“智”向“绿...   央视网消息:12月25日,国家邮政局举行新闻发布会。相关负责人表示,“十四五”期间,我国快递包装...
教育部公布2024—2025学...   近日,教育部发布公告,公布2024—2025学年度本专科生国家奖学金获奖学生名单。跟教育小微一起...
视频丨多国人士:日本错误言论扰...   针对日本首相和官员近期在涉台、涉核问题上的错误言论,多国人士表示日本此类表态和举动扰动地区局势,...
脱贫村的这五年 | 从“苏醒动...   沉寂许久的白雾村,喧腾了起来——  明清时期的石板路旁,村民支起小摊摆上凉粉,清亮的吆喝声从街头...