2016-02-27 63 views
0

在node.js的,假设你有异步调用的顺序的MongoDB如:Node.js和MongoDB - 多个异步数据库操作的原子性?

collection.find(query, projection).toArray(function(err, result) { 

    var document = result[0]; 

    // Do something based off of fields in document... 

    collection.update(...)(function(err, result) { 

     // Do something... 

    }); 
}); 

这是否会整块发生原子?或者在快速连续多次调用此方法时可能发生交错?

我的想法是:由于find是一个异步操作,它发生在一些后台线程上。因此,第二次调用此方法可能会运行相同的find命令并在第一次调用之前有机会更新文档之前得到完全相同的结果。然后第二个调用对文档有一个陈旧的引用。

这是正确的还是我想这一切都错了?

回答

3

不,这不是代码的原子块。快速多次调用代码可以在更新之前多次调用find,因此不会运行您想要的更新。如果您使用各种update operators而不是读取值,则在代码中更新它们,然后将值写回来,MongoDB具有原子更新。

inc是最简单的一个例子。您可以编写代码来读取数字,将其增加,然后将更新的值写回。但是,如果同时调用该代码,它可以读取值两次,两次调用将数字递增为相同的值,其中一次写入“胜利” - 将值增加一次而不是两次。然而,使用inc会自动处理此案例(仔细考虑您的write concern)。

要更具体地回答您的问题,请使用MongoDB更新操作符实现“基于文档中的字段执行某些操作”。