我想更新一個涉及讀取其他集合和複雜修改的文檔,因此findAndModify()
中的更新運算符不能滿足我的目的。用Mongoose在MongoDB中查找,修改和保存流程時發生衝突
這是我有:
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是:在一個單一的文件
操作總是原子性的MongoDB數據庫
我有點無所適從Operations
的意思。
- 這是否意味着,
findById()
將獲得鎖,直到doc
超出範圍(響應發送後),所以不會有衝突? (我不這麼認爲) - 如果沒有,如何修改我的代碼以支持多個客戶端知道他們將修改Collection?
- 如果發生Mongoose報告衝突,它會發生衝突嗎?
- 如何處理可能的衝突?是否可以手動鎖定收藏夾?
- 我看到的建議,使用貓鼬的
versionKey
(或時間戳)和重試陳舊文件 - 不要完全使用MongoDB的...
- 我看到的建議,使用貓鼬的
感謝。
爲指針編輯
感謝@jibsales,我現在用的貓鼬的versionKey
(時間戳也將工作),以避免犯衝突。
aaronheckmann — Mongoose v3 part 1 :: Versioning
參見此示例代碼:
https://gist.github.com/anonymous/9dc837b1ef2831c97fe8
在註釋塊(附加邏輯)中是否有異步代碼?看起來你是這樣做的,在這種情況下,你最終可能會保存陳舊的數據。你可能會有這樣的成功:https://www.npmjs.org/package/mongoose-timestamp。 – dylants
是的,我還發現一些建議使用Mongoose的versionKey並重試過時的文檔。這是你的建議嗎? – leesei