关于 mongodb 的分页查询
发布于 8 年前 作者 fiftyk 3580 次浏览 来自 问答

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 回复

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

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

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

@haozxuan

谢谢你的回答。

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

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

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

@leim

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

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

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

谢谢你。

回到顶部