来自docs:
versionKey是首次创建时在每个文档上设置的属性 通过Mongoose。此键值包含的内部修订版 文献。此文档属性的名称是可配置的。该 默认是__v。如果这与您的应用程序冲突,您可以 如此配置:
[...]
也可以通过将versionKey设置为来禁用文档版本控制 假。除非您知道自己在做什么,否则请勿禁用版本控制。
但我很好奇,在哪些情况下禁用此功能应该是安全的?
答案 0 :(得分:25)
版本密钥的目的是乐观锁定。
启用后,只要文档更新,版本值就会以原子方式递增。
这允许您的应用程序代码测试是否在获取(例如,引入版本密钥42)和后续更新(确保版本值仍为42)之间进行了更改。 如果版本密钥具有不同的值(例如,43因为已对文档进行了更新),则应用程序代码可以处理并发修改。
在关系数据库中经常使用相同的概念,而不是可能带来可怕性能的悲观锁定。所有下降ORM都提供这样的功能。例如,它被很好地描述为in ObjectDB documentation。它是一个用Java实现的对象数据库,但适用相同的概念。
Behlül评论中链接的blog post通过具体示例展示了乐观锁定的有用性,但仅针对数组更改,请参见下文。
相反,这是一个简单的案例,它无用:用户档案可以由其所有者自己编辑。在这里你可以摆脱乐观锁定,并假设最后一次编辑总是获胜。
所以,只有你知道你的应用程序是否需要乐观锁定。用例用例。
猫鼬情况有点特别。
仅对阵列启用乐观锁定,因为内部存储格式使用位置索引。这是问题评论中链接的blog post所描述的问题。我发现mongoose-orm
邮件列表中给出的explanation非常明确:如果您需要对其他字段进行乐观锁定,则需要自己处理。
以下是gist,其中显示了如何为add
操作实施重试策略。同样,你想如何处理它取决于你的用例,但它应该足以让你开始。
我希望这能解决问题。
干杯