聚合框架中的 $skip 和 $limit

2024-03-23

当我阅读该文档时,我发现以下注释:

当管道中 $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规则适用。


由于这是我们正在讨论的文本搜索查询,因此最佳形式是这样的:

db.collection.aggregate([
    { 
       "$match": {
               "$text": { "$search": "cake tea" }
    }
    },
    { "$sort": { "score": { "$meta": "textScore" } } },
    { "$limit": skip + limit },
    { "$skip": skip }
])

顶部“排序”结果中的内存保留的基本原理只能在其自身的“限制”内起作用,并且对于超出一些合理的数据“页面”之外的任何内容来说,这都不是最佳的。

除了内存消耗的合理范围之外,额外的阶段可能会产生负面影响而不是正面影响。

这些确实是 MongoDB 当前形式可用的文本搜索功能的实际限制。但对于任何更详细且需要更高性能的内容,就像许多 SQL“全文”解决方案的情况一样,您最好使用外部“专用”文本搜索解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

聚合框架中的 $skip 和 $limit 的相关文章

随机推荐