当我阅读该文件时,我发现以下注释:
当管道中的$sort紧跟在$limit之前时,$sort操作只会在执行过程中维护前n个结果,其中n是指定的限制,MongoDB只需要在内存中存储n个项.当allowDiskUse为true且n项超过聚合内存限制时,此优化仍然适用.
如果我是对的,它只适用于当我同时使用$sort和$limit时,比如
db.coll.aggregate([
...,
{$sort: ...},
{$limit: limit},
...
]);
然而,我想大部分时间我们都会
db.coll.aggregate([
...,
{$sort: ...},
{$skip: skip},
{$limit: limit},
...
]);
Question 1:如果我在这里使用$skip,是否意味着上述规则不适用?
我问这个问题是因为理论上MongoDB仍然可以计算前n条记录,并通过只排序前n条记录来提高性能.但是我没有找到任何关于这个的文件.如果规则不适用,
Question 2:我是否需要将查询更改为以下内容以提高性能?
db.coll.aggregate([
...,
{$sort: ...},
{$limit: skip + limit},
{$skip: skip},
{$limit: limit},
...
]);
EDIT:我认为解释我的用例会让上面的问题更有意义.我正在使用MongoDB 2.6提供的文本搜索功能查找产品.我担心如果用户输入一个非常常见的关键字,比如"red",就会返回太多结果.因此,我正在寻找更好的方法来产生这个结果.
EDIT2:事实证明,上面的最后一个代码等于
db.coll.aggregate([
...,
{$sort: ...},
{$limit: skip + limit},
{$skip: skip},
...
]);
因此,我认为我们可以使用这个表格来应用top n规则.