简短的问题是标题:我使用我的 mongo Shell,默认情况下处于安全模式,我希望通过停用此行为来获得更好的性能。
对于那些愿意了解上下文的人的长问题: 我正在处理大量数据,例如
{
_id:ObjectId("azertyuiopqsdfghjkl"),
stringdate:"2008-03-08 06:36:00"
}
和其他一些字段,大约有 250M 的文档(索引权重为 36Go 的整个数据库)。我想在真正的 ISODATE 字段中转换日期。我搜索了一下如何进行更新查询,例如
db.data.update({},{$set:{date:new Date("$stringdate")}},{multi:true})
但没有找到如何使这项工作,并决定自己制作一个脚本,一个接一个地获取文档并进行更新以设置一个以新日期(字符串日期)作为其值的新字段。查询使用 _id,因此使用默认索引。
问题是它需要很长时间。我已经发现,如果我在创建数据库时插入了空日期对象,我现在将获得更好的性能,因为添加新字段时会出现数据重定位问题。我还在相关字段上设置了一个索引,以逐块处理数据库。最后,我在服务器和我的工作站上运行了几个并发的 mongo 客户端,以确保限制因素是数据库锁的可用性,而不是任何其他因素,如 cpu 或网络成本。
我用 mongotop、mongostats 和 web 监控界面监控了整个事情,确认写锁占用了 70% 的时间。我有点失望 mongodb 没有更精确的写锁粒度,为什么不允许在同一个集合上进行并发写操作,只要不存在干扰风险?现在我想起来了,即使在同一台服务器上,我也应该将集合分片到十几个分片上,因为每个分片上都会有单独的锁。
但是由于我现在无法对当前的数据库结构做任何事情,所以我搜索了如何提高性能以至少花费我 90% 的时间在 mongo 中编写(目前是 70%),我发现自从我运行我的脚本在默认的 mongo shell 中,每次我进行更新时,还有一个 getLastError() 之后会调用它,我不想要它,因为有 99.99% 的成功机会,即使在失败的情况下我也可以在大流程结束后仍然发出聚合请求以检索单个异常。
我认为通过停用 getLastError 调用不会获得如此多的性能,但我认为值得一试。
我查看了文档并找到了默认行为的确认,但没有找到更改它的过程。有什么建议吗?