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