CNode

关于 mongodb 的分页查询

问答
Ffiftyk发布于10 年前最后回复10 年前7 回复4843 浏览0 收藏

NOTE When a $sort immediately precedes a $limit in the pipeline, the $sort operation only maintains the top n results as it progresses, where n is the specified limit, and MongoDB only needs to store n items in memory. This optimization still applies when allowDiskUse is true and the n items exceed the aggregation memory limit.

Changed in version 2.4: Before MongoDB 2.4, $sort would sort all the results in memory, and then limit the results to n results.

上文摘自 MongoDB 3.2.9 的官方文档。文中描述的意思是什么?

query.sort({someField: 1}).limit(10);

实际上是先取了 10 个记录,再排序这 10 条记录的吗?

查看回复

回复 (7)

L
leim#1·10 年前

这是在aggregate中的限制,在普通的query中没有吧。

H
haozxuan#2·10 年前

不要断章取义,更不要猜测,你可以实际在命令行中测试下: 1、在aggregation中,优先级是是先每一个stage,然后limit,最后sort; 2、在普通的CURD中,limit和sort的组合,总是先执行sort后执行limit,跟写法的前后顺序无关; 3、你的标题有问题,mongodb的分页问题是skip和limit的讨论,你的问题本质上跟limit和sort;

F
fiftyk#3·10 年前
引用 leim这是在aggregate中的限制,在普通的query中没有吧。

@leim 你好,我没有交待清除,的确是在 aggregate 中。我想问的也是在 aggregate 中是不是这样。谢谢你的提醒。

F
fiftyk#4·10 年前
引用 o6875461已测试aggregate sort后立即limit,查询结果和find后sort无limit 顺序一致,是不是文档没更新?

@o6875461 摘自 MongoDB 3.2.9 的官方文档,文档内容没有更新?我自己也试试。

谢谢你。

F
fiftyk#5·10 年前
引用 haozxuan不要断章取义,更不要猜测,你可以实际在命令行中测试下: 1、在aggregation中,优先级是是先每一个stage,然后limit,最后sort; 2、在普通的CURD中,limit和sor...

@haozxuan

谢谢你的回答。

的确文不对题了,我是在 aggregate 做分页时遇到了一些问题,然后查到了上面这段描述。

我在代码中并没有在 sort 后直接 limit,而是 sort > skip > limit。这种情况 mongodb 会是如何处理呢?

......其实有点懒了,用点数据可以测一下的。

F
fiftyk#6·10 年前
引用 leim这是在aggregate中的限制,在普通的query中没有吧。

@leim

多亏你的提醒,要不我真是以为在普通的 query 中也是这样。

O
o6875461#7·10 年前

已测试aggregate sort后立即limit,查询结果和find后sort无limit 顺序一致,是不是文档没更新?

参与回复
登录后即可参与回复。登录