mongoDB的排序问题

发布于 2022-08-24 00:52:01 字数 322 浏览 14 评论 0

有一个List ArrayList<Long> al=new ArrayList<Long>();里面存储了从外部获取的数据的ID并且进行了排序(随机抽取的ID,按照先后放入LIST),然后把这些ID在mongoDB通过inObj.put("_id", new BasicDBObject("$in", list));进行in查询,获取后的结果并不和LIST中ID的顺序一样,搜索了一下,有文章说不指定排序的话,mongodb会按照$natural进行排序,但是我测试了一下,并不是这样。
现在问题是怎么才能让mongodb按照list的排序获取结果呢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

回眸一笑 2022-08-31 00:52:01

这是个很好的问题。其实你查的文章没有说错,不指定排序,就是按自然排序排的。只不过这个自然排序是指按照_id的自然排序去排。你的list只是一个查询条件,就相当于x > max AND x < min指定的一个查询范围,跟排序完全没有关系,不论是什么数据库系统,都会在你指定的这个list范围内找到数据后再按自身的排序方法来排序。

我的建议是你还是按这种方法去取值,取出来后,自己在java程序里循环一遍,然后跑出排序后的数组。

jJeQQOZ5 2022-08-31 00:52:01

@joyqi 的说法不太对,MongoDB里的自然排序(也就是按$natural字段排序)与按_id字段排序是不同的。自然排序是按数据在数据文件中的组织顺序来排序的。

你可以explain一下你的查询,就能看到它利用索引的情况,比如你用下面的语句插入数据:

> db.test.insert({a:2,b:1})
> db.test.insert({a:1,b:2})
> db.test.insert({a:2,b:3})
> db.test.insert({a:1,b:4})

在你不对a字段加索引时,会得到下面的结果,下面就是自然排序的结果:

> db.test.find({a:{$in:[1,2]}})
{ "_id" : ObjectId("4f509380ea72116cb2137567"), "a" : 2, "b" : 1 }
{ "_id" : ObjectId("4f509380ea72116cb2137568"), "a" : 1, "b" : 2 }
{ "_id" : ObjectId("4f509380ea72116cb2137569"), "a" : 2, "b" : 3 }
{ "_id" : ObjectId("4f509380ea72116cb213756a"), "a" : 1, "b" : 4 }

因为这时候MongoDB是排表的查询,扫到一条数据满足条件就加入到返回列表中。所以是按自然顺序来做的。

而如果你加上索引再查,会得到下面的结果

> db.test.ensureIndex({a:1})
> db.test.find({a:{$in:[1,2]}})
{ "_id" : ObjectId("4f509537ea72116cb213756f"), "a" : 1, "b" : 4 }
{ "_id" : ObjectId("4f509530ea72116cb213756d"), "a" : 1, "b" : 2 }
{ "_id" : ObjectId("4f509534ea72116cb213756e"), "a" : 2, "b" : 3 }
{ "_id" : ObjectId("4f50952cea72116cb213756c"), "a" : 2, "b" : 1 }

可以看到,结果按a为1,a为2分开了,因为按索引查询时,相当于是在索引中查多段数据,这里的例子里,相当于是查了a的范围为[1,1]和[2,2]两个范围的数据,这两次在逻辑上是串行的,先查[1,1]的数据,再查[2,2]的数据,所以这里a为1和2的分开了。

哽咽笑 2022-08-31 00:52:01

没用过mongodb,不过感觉这个问题的答案和别的关系型数据库一样的。如果你在关系型数据库中这样插入ID,而ID又是主键的话,那么数据库会自动按照ID的值进行排序,因为主键本身是一个聚集索引,要达到你想要的效果很简单,不要自己生成ID,让Mongodb生成一个自动自增的ID,这样插入时排序是按照这个自增值排序的,你读取的时候也是按照插入顺序读取的。

妖妓 2022-08-31 00:52:01

搜出来再排!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文