将`save()`视为用于更新Mongoose中的文档的反模式?

时间:2017-06-15 14:43:46

标签: node.js mongodb 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端进行更新会更好?

2 个答案:

答案 0 :(得分:1)

请记住,最终的一致性就是模型。 Mongo最终会保持一致,所以变化只会影响其他变化;但重要的是要注意,大部分时间这都是在mongo方面没有阻塞。

所以真正的答案是否定的......但是答案是肯定的,但最终会纠正自己。

save()是反模式吗?这真的取决于你..如果你采取更多的OO而不是功能我认为可以使用

答案 1 :(得分:0)

case codePush.SyncStatus.UPDATE_INSTALLED: self.setState({modalVisible: true}); break; 后跟find只不过是用所有字段更新文档。您可能不会save而只是find文档会重新填充所有字段。

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

save和类似的方法是原子和服务器端(mongo),它通过锁定来处理concurrency。除非您需要处理文档然后保存,我认为findOneAndUpdate方法通常更适合。 Thisthis SO回复在回答类似问题方面做得很好。