allowDiskUse 对 mongodb 中的 find() 方法有效吗?

bar*_*ker 4 mongodb

我正在尝试测试一些关于运行缓慢的查询的理论 - 因此我希望我的查询运行缓慢。因此,我在我的收藏中省略了索引。当我运行db.mycollection.find({myfield: /.abc./}).sort({myfield2: 1}, {allowDiskUse: true})方法时,我收到以下错误...

Error: error: {
        "ok" : 0,
        "errmsg" : "Executor error during find command: OperationFailed: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.",
        "code" : 96,
        "codeName" : "OperationFailed"
}
Run Code Online (Sandbox Code Playgroud)

好的。我想继续在磁盘上排序,但似乎聚合框架命令“allowDiskUse:”对 find() 方法没有执行任何操作。我收到同样的错误。

“allowDiskUse”在与 find() 一起使用时有效,还是仅在与聚合框架一起使用时有效?

我似乎找不到任何说明它是特定于框架的文档,但话又说回来,它似乎不适用于 find()。也许这是一个宽松的答案。我想我正在寻求更具体的答案。

Wer*_*eit 7

在 MongoDB 4.4 版本中添加了此功能:cursor.allowDiskUse()

allowDiskUse()具有以下形式:

db.collection.find(<match>).sort(<sort>).allowDiskUse()
Run Code Online (Sandbox Code Playgroud)


Ste*_*nie 5

“allowDiskUse”在与 find() 一起使用时有效,还是仅在与聚合框架一起使用时有效?

allowDiskUse选项特定于聚合框架。

排序操作使用的 RAM 超过最大 33554432 字节。

您可以sort()find()查询中删除以避免达到内存中排序限制

希望我的查询运行缓慢。

虽然这不是典型的目标,但可以使用以下一些选项来减慢此查询:

  • 用于强制hint()进行集合扫描或非最佳索引选择(但排序限制仍然适用)

  • 使您的正则表达式查询不区分大小写{myfield: /abc/i}

  • mongod限制可用于使用cgroups虚拟机的资源。有限的 RAM(您的工作集明显大于 RAM)和缓慢的磁盘可能会导致查询缓慢。