【发布时间】:2017-04-19 03:20:46
【问题描述】:
我遇到了更新同一文档的并发请求的问题。我没有使用findAndModify(),因为我需要访问文档的当前状态来进行更新,我认为findAndModify() 不支持该更新。我也想避免使用db.fsyncLock(),因为它会锁定整个数据库,我只需要将一个文档锁定在一个集合中。
首先我使用findOne() 来获取一个文档,然后我在findOne() 的回调中使用updateOne() 来更新同一个文档。当我将一堆动作排队并同时运行它们时,我相信它们在调用 findOne() 时都在访问相同的状态,而不是等待 updateOne() 从上一个动作完成。
我应该如何处理?
mongoDBPromise.then((db)=> {
db.collection("notes").findOne(
{path: noteId},
(err, result)=> {
if (err) {
console.log(err);
return;
}
if (!result.UndoableNoteList.future.length) {
console.log("Nothing to redo");
return;
}
let past = result.UndoableNoteList.past.concat(Object.assign({},result.UndoableNoteList.present));
let present = Object.assign({},result.UndoableNoteList.future[0]);
let future = result.UndoableNoteList.future.slice(1, result.UndoableNoteList.future.length);
db.collection("notes").updateOne(
{path: noteId},
{
$set: {
UndoableNoteList: {
past: past,
present: present,
future:future
}
}
},
(err, result)=> {
if (err) {
console.log(err);
return;
}
}
)
}
);
});
【问题讨论】:
标签: node.js mongodb concurrency