数据库 - mongo使用$in查询结果的排序问题。

 mmmm的海角_771 发布于 2022-10-25 03:16

最近的项目使用mongo作为数据库,遇到了一个问题。

db.col_content.find({'nodeID':{$in:[d,c,b,a]}})

使用这样的查询的时候,查询的结果是按照自然排序的,即:

{a.....},
{b.....},
{c.....},
{d.....},

不是在传值的时候的{d,c,b,a};
我的猜测是,$in的操作是按照自然排序遍历数据,依次跟$in里面的数据进行比较,所以才会最终的数据按照自然排序,但是现在的业务需求需要按照传值的顺序,难道只能代码层实现排序了吗?
我用的是PHP,不知道有没有比较简单的方法来进行排序。
请指教。


刚才看到另外一个类似的问题,如果有在nodeID上加索引的话,就会根据$in的传值进行查询。我去试一试。


加了索引之后确实按照传入顺序进行排序了,但是楼下已经有人说了,这个是mongo的特性,不能作为依赖,现在只能通过代码层来实现了。

1 个回答
  • 我能猜测到为什么会有这样的结果:

    1. 如果没有索引,那么做COLLSCAN是按$natural顺序遍历的,所以出来的也是自然排序;

    2. 如果有索引,则会逐个key做IXSCAN,然后逐个放进结果集里,也就是你要的顺序。

    从编程的角度讲,这是有意义的。但是没有任何保证将来的MongoDB版本也会一直保持这样的行为。
    事实上大部分数据库在不指定排序的时候都会以随机顺序,也就是引擎认为最高效的顺序返回结果。所以即使现在最高效的顺序正好是你想要的顺序,不代表将来一直会这样。不要依赖这个功能,否则将来在某个版本升级的时候会出现非常奇怪且难以定位的问题。
    个人建议:

    1. 如果可能,按照输入的顺序指定排序来得到正确的结果顺序。

    2. 如果输入的顺序无法指定,在程序中自行排序。

    2022-10-26 14:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有