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
条记录的吗?
这是在aggregate中的限制,在普通的query中没有吧。
不要断章取义,更不要猜测,你可以实际在命令行中测试下: 1、在aggregation中,优先级是是先每一个stage,然后limit,最后sort; 2、在普通的CURD中,limit和sort的组合,总是先执行sort后执行limit,跟写法的前后顺序无关; 3、你的标题有问题,mongodb的分页问题是skip和limit的讨论,你的问题本质上跟limit和sort;
@leim
你好,我没有交待清除,的确是在 aggregate
中。我想问的也是在 aggregate
中是不是这样。谢谢你的提醒。
谢谢你的回答。
的确文不对题了,我是在 aggregate
做分页时遇到了一些问题,然后查到了上面这段描述。
我在代码中并没有在 sort
后直接 limit
,而是 sort > skip > limit
。这种情况 mongodb 会是如何处理呢?
…其实有点懒了,用点数据可以测一下的。
多亏你的提醒,要不我真是以为在普通的 query
中也是这样。
已测试aggregate sort后立即limit,查询结果和find后sort无limit 顺序一致,是不是文档没更新?
@o6875461
摘自 MongoDB 3.2.9
的官方文档,文档内容没有更新?我自己也试试。
谢谢你。