Javascript Node.js中的事件循环和数据库访问

Javascript Node.js中的事件循环和数据库访问,javascript,node.js,mongodb,rest,Javascript,Node.js,Mongodb,Rest,我一直在阅读一些关于Node.js的信息,有一个特别的问题。 让我试着用下面的例子来解释它: model.book.findOne({'Id': request.params.Id}, null, function (err, book) { if (err || book== null) { //Do some error handling } //Rating calculation happens here (add new rating and calcu

我一直在阅读一些关于Node.js的信息,有一个特别的问题。 让我试着用下面的例子来解释它:

model.book.findOne({'Id': request.params.Id}, null, function (err, book) {
   if (err || book== null) {
      //Do some error handling
   }

   //Rating calculation happens here (add new rating and calculate the average)
   //Something like book.ratings.push(...)

   book.save(function (err) {
       if (err) {
           console.log(err);
       }
       return reply(book);
   });
}
用户可以对我的服务器进行rest调用,在那里他们可以对数据库中的一本书进行评级(本例中是MongoDb)。如果两个用户执行相同的rest请求的时间非常接近,会发生什么情况?是否会发生以下情况:

  • User1执行rest请求
  • User1从数据库中按id获取图书
  • User1开始进行评级计算
  • User2执行rest请求
  • User2从数据库中按id获取图书
  • User1完成计算并保存书本
  • User2开始进行评级计算(用户1没有新的评级)
  • User2完成计算并保存书本

提前谢谢

@Jdruwe Mongodb支持文档中的原子操作,因此您不必担心写操作看起来您正在使用Mongoose。如果是这样,Mongoose的
push
是原子的(请参阅),因此您不必担心并发写入。这是否意味着回调返回的book对象可以安全地编辑和保存,而不必关心其他请求?当然,如果计算在内存中完成,文档中Mongo中的所有操作都是原子的(我猜在本例中,当加载book对象,然后进行一些操作时)如果编码不正确,很有可能会出现错误场景……是的,我也这么想,所以我决定使用findOneAndUpdate。