Mongoose版本控制:什么时候禁用它是安全的?

fra*_*zon 10 mongoose mongodb

来自文档:

versionKey是Mongoose首次创建时在每个文档上设置的属性.此键值包含文档的内部修订版.此文档属性的名称是可配置的.默认值为__v.如果这与您的应用程序冲突,您可以这样配置:

[...]

通过将versionKey设置为false,也可以禁用文档版本控制.除非您知道自己在做什么,否则请勿禁用版本控制.

但我很好奇,在哪些情况下禁用此功能应该是安全的?

esk*_*tos 27

版本的关键目的是乐观锁定.

启用后,只要更新文档,版本值就会以原子方式递增.

这允许您的应用程序代码测试是否在获取(例如,引入版本密钥42)和后续更新(确保版本值仍为42)之间进行了更改.如果版本密钥具有不同的值(例如,43因为已对文档进行了更新),则应用程序代码可以处理并发修改.

在关系数据库中经常使用相同的概念,而不是可能带来可怕性能的悲观锁定.所有下降ORM都提供这样的功能.例如,在ObjectDB文档中很好地描述它.它是用Java实现的对象数据库,但适用相同的概念.

Behlül评论中链接的博客文章通过具体示例展示了乐观锁定的有用性,但仅针对数组更改,请参见下文.

相反,这是一个简单的案例,它无用:用户配置文件可以由其所有者自己编辑.在这里你可以摆脱乐观锁定并假设最后一次编辑总是获胜.

所以,只有你知道你的应用程序是否需要乐观锁定.用例用例.

猫鼬情况有点特殊.

仅对阵列启用乐观锁定,因为内部存储格式使用位置索引.这是问题评论中链接的博客文章所描述的问题.我发现邮件列表中给出的解释mongoose-orm非常明确:如果您需要对其他字段进行乐观锁定,则需要自己处理.

这是一个要点,展示了如何为操作实现重试策略add.同样,你想如何处理它取决于你的用例,但它应该足以让你开始.

我希望这能解决问题.

干杯

  • @esKotos我认为你的新更新答案看起来不明确,因为当我们只更新任何非数组字段时版本控制不起作用。 (2认同)
  • @SandeepSharma,您需要在任何 save() 之前调用 document.increment()。如果保存成功(验证正常并且没有版本冲突),这将向增量版本发出信号 (2认同)