【发布时间】:2021-10-27 15:45:29
【问题描述】:
我在 Ubuntu Server 16.04 下的 WiredTiger 上运行 MongoDB 4.0 来存储复杂的文档。其中一个集合存在问题:文档中有许多图像以 base64 字符串形式写入。 我知道这是一种不好的做法,但我需要一些时间来解决它。
因此,一些find 操作失败,但只有那些具有非空过滤器或skip 的操作失败。例如db.collection('collection').find({}) 运行正常,而db.collection('collection').find({category: 1}) 只是在超时后关闭连接。应该返回多少文档并不重要:如果有过滤器,每次都会弹出错误(即使它应该返回 0 个文档),而空查询始终执行良好,直到 skip 太大。
UPD:一些skip 值会使查询失败。 db.collection('collection').find({}).skip(5000).limit(1) 运行良好,db.collection('collection').find({}).skip(9000).limit(1) 需要很多时间但也执行,而 db.collection('collection').find({}).skip(10000).limit(1) 每次都失败。看起来有某种缓冲区,数据库在其中存储与查询相关的数据,并且在 10000 个文档上它耗尽了资源。该集合本身有大约 10500 个文档。此外,通过_id 搜索运行正常。不幸的是,我没有机会创建新索引,因为操作失败,就像read。
在从集合中删除 base64 图像之前,我可以使用什么临时解决方案?
【问题讨论】:
-
尝试使用
explain运行其中一个查询以查看规划器在做什么,并检查 mongod 日志是否有错误。 -
尝试使用聚合,但我怀疑它会给出任何差异结果。
even if it should return 0 docs- 尝试设置limit 1 -
@Joe 如果我这样做,查询会以超时结束,并且数据库会在约 30 秒后重新启动。我在日志中没有看到任何错误,只有关机-启动顺序。
-
@dododo 同样的事情
-
然后,您可以查看服务器日志以查看问题(尝试设置 $comment docs.mongodb.com/v4.0/reference/operator/query/comment 以更快地找到相关日志)
标签: mongodb mongodb-query wiredtiger