当我阅读该文档时,我发现以下注释:
当管道中 $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},
...
]);
问题1: 如果我在这里使用$skip,是否意味着上面的规则不适用?
我问这个问题是因为理论上MongoDB还是可以计算top的n记录并通过仅排序顶部来提高性能n记录。不过我没有找到任何关于此的文件。如果这条规则不适用,
问题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规则适用。