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

当管道中的$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规则.

推荐答案

由于这是我们讨论的文本搜索查询,因此最理想的形式是:

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

从最上面的"排序"结果中提取内存储备的原理只能在其自身的"限制"范围内工作,而这对于超出几个合理的数据"页面"的任何内容都不是最佳的.

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

这些都是MongoDB目前的文本搜索功能的实际局限性.但对于任何更详细、要求更高性能的内容,就像许多SQL"全文"解决方案一样,最好使用外部"专门构建"的文本搜索解决方案.

Mongodb相关问答推荐

在单个mongo文档中组合数组与聚合

如何使用ID数组对一个集合中的金额求和并更新另一个集合中的字段?

MongoDB $lookup 查找字段值数组

从 Amazon S3(Next.js、Mongodb、Mongoose)删除图像

如何从集合中移除所有匹配的数组项?

优化游戏应用程序的反馈表单后端设计

MongoDB 使用 pymongo 收集 500K 文档的写入速度很差

MongoDB - 使用许多嵌套对象更新嵌套数组

替换 MongoDB 中数组中的嵌入文档

从 PHP 打印 MongoDB 日期

删除嵌套文档数组中的嵌入文档

我怎样才能更快地scrape

Mongoose 与 mongodb 如何返回刚刚保存的对象?

如何在mongodb中删除数组的第n个元素

使用 Java 驱动程序更新 MongoDB 中的数组

在 mongodb 中插入当前日期时间

MongoDB MapReduce - 发出一个键/一个值不调用reduce

Mongoose:查询starts with

如何在 MongoDB 中删除此弃用警告,为什么会这样?

'this' 在 Mongoose 预保存挂钩中未定义