我遇到了更新同一文档的并发请求的问题。我没有使用findAndModify()
,因为我需要访问文档的当前状态才能进行更新,但我看不到findAndModify()
支持该更新。我也想避免使用db.fsyncLock()
,因为它锁定了整个数据库,我只需要在一个集合中锁定一个文档。MongoDB并发问题与findOne和updateOne
首先我使用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;
}
}
)
}
);
});
当我删除updateOne时,不会保存文档。我现在有一个解决方案,我排队的数据库调用,并一次做一个,但它会很好,如果数据库管理这个队列 – sissonb
当然,它不会被保存,除非你调用结果。保存()'明确。但是,如果请求是并行产生的,'result.save()'可以同时发生在同一个文档中。 –
结果对象只是一个包含我的数据的普通对象。调用'result.save()'给了我下面的错误'TypeError:result.save不是函数' – sissonb