我想根据搜索条件更新单个记录(类似于findOne,但我想更新一个)。这必须是原子的,因为.find() then .update()
将利用节点的精彩异步性质,并在查找之后和更新之前保持记录打开以进行更改。
让我们说要简化我记录我的财产的事情,我想通过网站借给朋友。如果两个朋友同时想借用任何可用的书籍,我需要将其属性标记为正在使用以防止出现问题。
如果我使用Book.find(available==true)
然后使用Book.update(book, available=false)
,则可能会出现竞争条件,其中线程运行.find()
并且在等待从数据库回听时,调用.find()
对于其他用户,两者都导致同一本书借出。这显然是一个问题,也是我想要防范的。
如何防范这种情况?有没有办法使用水线的辅助方法更新一条记录?或者我是否需要执行本机SQL查询?
答案 0 :(得分:0)
你可以使用mongodb native findAndModify():
var ObjectId = require('mongodb').ObjectID;
Book
.native(function (err, collection) {
collection.findAndModify(
{_id: new ObjectId(Id), available: true},
{$set:{ available: false}},
{ upsert: true }
function (err, result) {
// manage after update
}
});