我正在尝试测试运行缓慢的查询的一些理论-因此,我想要查询运行缓慢。因此,我在集合上省略了索引。当我运行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"
}
好的。我想继续在磁盘上进行排序,但似乎聚合框架命令'allowDiskUse:'对find()方法没有任何作用。我收到同样的错误。
“ allowDiskUse”在与find()一起使用时是否有效,或者仅在与Aggregation Framework一起使用时有效?
我似乎找不到任何说明它是特定于框架的文档,但是同样,它似乎不适用于find()。也许这是一个宽松的答案。我想我正在寻找一个更具体的答案。
答案 0 :(得分:1)
'allowDiskUse'在与find()一起使用时是否有效?或者仅在与Aggregation Framework一起使用时有效吗?
allowDiskUse
选项特定于聚合框架。
排序操作所使用的RAM超过了33554432个最大字节。
您可以从sort()
查询中删除find()
,以避免碰到in-memory sort limit。
我想要查询运行缓慢。
虽然这不是一个典型的目标,但有一些使该查询速度变慢的选择:
使用hint()
到force a collection scan或非最佳索引选择(但排序限制仍然适用)
创建您的regex query case-insensitive:{myfield: /abc/i}
使用cgroups
或虚拟机限制mongod
可用的资源。有限的RAM(您的工作集明显大于RAM)和缓慢的磁盘会导致缓慢的查询。
答案 1 :(得分:0)
在MongoDB 4.4版中,此功能已添加:cursor.allowDiskUse()
allowDiskUse()
具有以下形式:
db.collection.find(<match>).sort(<sort>).allowDiskUse()