请看下面的例子:
const myDoc = await model.findById(id).exec();
// here runs long running operation which can take about 2-3 secs
myDoc.name = "Updated Name";
myDoc.save()是否可以使用此模式更新文档?如果在签出文档和保存文档之间(需要2-3秒),另一段代码将尝试更新此文档,该怎么办?这意味着来自其他代码的更改将不会被保存?
如果是,这是否意味着在MongoDB端使用findOneAndUpdate和类似的方法进行更新更好?
发布于 2017-06-15 22:47:26
请记住,最终的一致性是模型。Mongo最终将是一致的,因此更改将影响其他更改只是在一定程度上是正确的;但重要的是要注意,大多数情况下,这是非阻塞的。
所以真正的答案是不...但答案是肯定的,但它最终会自我修正。
save()是反模式吗?这真的是由你决定的..如果你采用更多的面向对象而不是函数式,我认为可以使用
发布于 2017-06-16 17:35:21
后跟save的find只不过是更新一个包含所有字段的文档。您最好不要使用find,而只使用update重新填充所有字段的文档。
查找和保存之间的时间间隔可能在几秒到几分钟之间。例如,向用户(find)显示一个编辑表单,用户修改某些字段并在15分钟后单击更新按钮(save);其他一些客户端在此期间所做的任何更改都将被覆盖。
findOneAndUpdate和类似的方法是原子的和服务器端的(Mongo),它通过锁定来处理concurrency。除非您需要先处理文档然后保存,否则我认为update方法通常更适合。This和this可以很好地回答类似的问题。
https://stackoverflow.com/questions/44570482
复制相似问题