有没有办法强制mongoose始终在保存时验证文档版本?据我所知,默认行为仅在修改文档中的数组时强制执行版本号。更糟糕的是,即使文档版本不匹配,似乎也允许将元素添加到数组中,因此,即使您正在修改数组,也需要替换数组以获取版本检查。 (请注意,我使用的模式使用无模式子文档(简单定义为" {}")可能会影响行为)。除this article之外,我无法找到有关该主题的任何文档。也许有一个插件可以做到这一点?
答案 0 :(得分:4)
免责声明:我自己编写了插件,根据this issue on GitHub在我自己的代码中解决了这个问题。
这已经很晚了,但希望总比没有好。
mongoose-update-if-current插件可能会为您提供您正在寻找的功能。它使用版本字段在文档上调用.save()
时添加了乐观并发控制。每次保存文档时它都会递增__v
,并防止不同版本相互保存。例如:
// saves with __v = 0
let product = await new Product({ name: 'apple pie' }).save();
// query a copy of the document for later (__v = 0)
let oldProduct = await Product.findById(product._id);
// increments to __v = 1
product.name = 'mince pie';
product = await product.save();
// throws an error due to __v not matching the DB version
oldProduct.name = 'blueberry pie';
oldProduct = await oldProduct.save();
因此,我们现在对Product
进行了乐观的并发控制。
警告:该插件仅验证.save()
中的版本,而不是Product.findByIdAndUpdate()
等静态模型方法。