findAndModify查询比findOne慢。假设正在插入一个集合文档,假设每2秒有100到200个文档。哪个更快做一个findOne或findAndModify。假设集合已正确索引,我的查询使用索引
答案 0 :(得分:1)
正如您已经指出的那样,.findAndModify()
旨在完全按照其说法执行操作,并通过更新或删除来“修改”检索到的文档。存在原子性质以避免并发状态问题,如果您在文档上.findOne()
,则对内容进行更改,然后尝试.update()
。
在后一种用例中,“无法保证”该文档与通过.findOne()
“检索”文档时的文档相同。所以实际上你可能会覆盖另一个进程所做的更改。
至于表现,这是比较“苹果与橘子”的经典之作,因为它们是两个不同的东西。在.findOne()
的情况下,只返回游标中的单个第一个结果,而.findAndModify()
中的另一个可能获取原始文档,使用默认写入关注或其他指定的写入关注进行更改,然后返回或者在放弃任何控制权以供他人修改之前检索文件。
每个版本的MongoDB都有不同级别的“锁定”,但重点是.findAndModify()
旨在完成更多工作,因此自然需要更长的时间。
如果你可以忍受只是检索一个文件,然后发送更新,那么很好。请注意,您应该比较的“苹果对苹果” 这些操作及其执行方式。
也可能是您可以考虑设置这些操作的写入问题,因为您也可以忍受写入未被确认的事实。但这真的取决于你。但在大多数人看来,使用针对其目的进行优化的工具通常会更好。