美文网首页我爱编程
聊一聊mongodb的自然排序

聊一聊mongodb的自然排序

作者: 超凡陆战队 | 来源:发表于2018-04-04 14:31 被阅读1647次

最近笔者在工作中遇到一个关于mongo排序的问题:
文章列表根据创建时间排序,当有多篇文章创建时间相同(批量导入),更新其中的文章顺序竟然变了。
笔者赶紧查看了一下代码,确认更新数据时没有改变数据的id和创建时间,第一感觉就是遇到灵异事件了,难道mongo的排序还不可靠?无数个黑人问号???
经过多次测试对比发现,只有数据第一次更新才会改变顺序,后面再操作就不会再变了,嗯第一次更新数据会增加updaeTimeupdateUser字段,难道这也会影响排序?印象中mongo默认是根据id来排序的,id没有变应该不会影响排序的呀。
看来问题就是出在这个默认排序上,开始疯狂的上网查资料,最后找到如下内容:

MongoDB的查询排序默认是未定义的,因此会返回文档的顺序。如果没有查询条件,那么将使用自然顺序(natural order)。结果以它们被找到的顺序来返回,可能与插入顺序(但不能保证)或者索引使用的顺序一致。

一些会影响存储(自然)顺序的情况:
. 如果文档被更新而无法放置在它们当前分配的空间,那么会被移动
. 新的文档可能会插入到因删除或移动文档而产生的可用空隙空间

如果使用了索引,文档将以通过索引被找到的顺序返回。如果使用了不止一个索引,那么顺序内部依赖于在重复数据删除(de-duplication)过程中首先通过哪个索引识别文档。

如果你需要一个特定顺序,那么你必需在你的查询中包含一个排序。

需要指出的特例是固定集合的自然顺序(Capped Collections‘ natural order),因为文档不能移动且以插入的顺序存储。排序是固定集合特性的部分,确保最旧的文档先删除掉。另外,在一个固定集合里文档不能被删除或移动。

说明影响自然顺序的情况:
如果文档被移动、删除,你可能得到不同的结果集。如果没有文档插入、更新、删除你会获得相同的结果。添加索引不会影响文档在磁盘上的位置。

这下就真相大白了,原来mongo默认排序是自然排序而不是我认为的id排序,赶紧再加上个按id排序问题解决。

参考资料:
http://www.mamicode.com/info-detail-1430295.html
https://docs.mongodb.com/manual/reference/method/cursor.sort/#return-natural-order
https://docs.mongodb.com/manual/indexes/#default-id-index

相关文章

  • 聊一聊mongodb的自然排序

    最近笔者在工作中遇到一个关于mongo排序的问题:文章列表根据创建时间排序,当有多篇文章创建时间相同(批量导入),...

  • 聊一聊插入排序和比较排序

    简介 插入排序和比较排序是排序算法中比较基础和简单的两种,其时间复杂度均为,在分析算法时间复杂度时,我们往往会只会...

  • 排序算法

    小胡子哥:聊一聊排序算法白话经典算法系列之五 归并排序的实现

  • 算法学习之InsertSort

    今天咱们来简单聊一聊这个叫做插入排序的算法。 思路: 我们视最左端的数字已完成排序 然后,取出那些尚未操作的左端的...

  • 聊一聊

    就是这样,喜欢自我欺骗,明知道,真心想你,或者有事的人,会打电话给你。却还是忍不住的用微信,看一个人的消息和动态,...

  • 聊一聊

    记录一下,现在是女儿的生日。2020.7.25星期六 生日快乐我的小天使 微淼商学院说过最经典的话是:有些做商学院...

  • 聊一聊

    早在三天前师兄就告知我们今天上午老师会和我们在实验室聊一聊。校园卡余额不足,时间紧张未吃早餐,早上慌忙收拾赶紧到实...

  • 聊一聊

    大家好,我是野生梅花鹿。 马上就12点了,我决定用几分钟的时间随便写点啥~ 首先呢,是反省。 这个月,其实懒惰了很...

  • 聊一聊

    很久没写了,聊聊最近发生的事,十月份开始了一段长板之旅,一开始担心害怕摔,因为通过挑战一个个动作,挺有趣的,当你为...

  • 聊一聊

    疫情这些年,常常听到的是,哪哪被封控了之类,作为天选打工人,一直在正常上班搬砖中。 直至上周五晚接...

网友评论

    本文标题:聊一聊mongodb的自然排序

    本文链接:https://www.haomeiwen.com/subject/vxmkhftx.html