【问题标题】:Is `save()` considered as antipattern for updating documents in Mongoose?`save()` 是否被视为在 Mongoose 中更新文档的反模式?
【发布时间】:2017-11-18 02:57:46
【问题描述】:

请看下面的例子:

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 端进行更新?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    请记住,最终一致性是模型。 Mongo 将最终保持一致,因此更改会影响其他更改只是有点真实;但重要的是要注意,大多数时候这在 mongo 方面是非阻塞的。

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

    save() 是反模式吗?这真的取决于你..如果你正在采取更多的面向对象而不是功能,我认为它可以使用

    【讨论】:

      【解决方案2】:

      find 后跟save 只不过是更新包含所有字段的文档。您最好不要 find 而只是 update 重新填写所有字段的文档。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-09
        • 2019-12-12
        • 2022-01-15
        • 2014-08-28
        • 2022-12-09
        • 2011-12-21
        • 2021-10-01
        • 1970-01-01
        相关资源
        最近更新 更多