`save()`被认为是反模式,用于更新Mongoose中的文档?

请看下面的例子:

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秒),那么另外一段代码将会尝试更新这个文件? 这意味着从另一个代码的变化将不会被保存?

如果是的话,这是否意味着使用findOneAndUpdate和类似的方法在MongoDB端更新更好?

请记住,最终的一致性是模型。 Mongo将最终保持一致,所以它的唯一的一点是真实的,即变化会影响其他的变化。 但重要的是要注意,大部分时间这在mongo方面是非阻塞的。

所以真正的答案是否定的,但有点答案是肯定的,但最终会自我纠正。

save()是一个反模式? 这真的取决于你..如果你正在采取更多的OO,而不是function,我认为它可以使用

find然后save只不过是更新所有领域的文件。 你可能还没有find ,只是update文件,所有的领域重新填写。

查找和保存之间的时间间隔可能在几秒到几分钟之间。 例如,向用户显示的编辑表单( find )在15分钟后修改某些字段并单击更新button( save ); 其他客户之间所做的任何更改都将被覆盖。

findOneAndUpdate和类似的方法是primefaces和服务器端(mongo),它处理并发locking。 除非你需要处理一个文件然后保存,我认为update方法通常更适合。 这个和这个 SO回答在回答类似的问题上做得很好。