gpt4 book ai didi

node.js - 使用 Mongoose 处理 MongoDB 中查找、修改、保存流程的冲突

转载 作者:可可西里 更新时间:2023-11-01 09:31:16 25 4
gpt4 key购买 nike

我想更新涉及读取其他集合和复杂修改的文档,因此 findAndModify() 中的更新运算符无法满足我的目的。

这是我所拥有的:

Collection.findById(id, function (err, doc) {

// read from other collection, validation
// modify fields in doc according to user input
// (with decent amount of logic)

doc.save(function (err, doc) {
if (err) {
return res.json(500, { message: err });
}

return res.json(200, doc);
});
}

我担心的是,如果多个客户端碰巧修改同一个文档,这个流程可能会导致冲突。
据说here那:

Operations on a single document are always atomic with MongoDB databases

我对Operations 的含义有点困惑。

  • 这是否意味着 findById() 将获取锁直到 doc 超出范围(发送响应后),因此不会有冲突? (我不这么认为)
  • 如果不是,如何修改我的代码以支持多个客户知道他们将修改集合?
  • 如果发生冲突,Mongoose 会报告吗?
  • 如何处理可能的冲突?是否可以手动锁定收藏?
    • 我看到建议使用 Mongoose 的 versionKey(或时间戳)并重试过时的文档
    • 不要完全使用 MongoDB...

谢谢。


编辑

感谢@jibsales 的指点,我现在使用 Mongoose 的 versionKey(时间戳也可以)来避免提交冲突。

aaronheckmann — Mongoose v3 part 1 :: Versioning

查看示例代码:
https://gist.github.com/anonymous/9dc837b1ef2831c97fe8

最佳答案

操作是指读/写。请记住,MongoDB 不是一个符合 ACID 的数据层,如果您需要真正的 ACID 合规性,您最好选择另一种技术。也就是说,您可以通过两阶段提交技术实现原子性和隔离 outlined in this article in the MongoDB docs .这是一项艰巨的任务,因此请准备好承担一些繁重的工作,因为您需要使用 native 驱动程序而不是 Mongoose。同样,我的最终建议是,如果您需要事务支持(听起来您确实需要),请不要喝 NoSQL koolaid。

关于node.js - 使用 Mongoose 处理 MongoDB 中查找、修改、保存流程的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24808473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com