防止在Mongoose中同时访问文档

我的服务器应用程序(使用node.js,mongodb,mongoose)有一个文档集合,对于这两个文档,两个客户端应用程序不能同时修改它们,而不看到彼此的修改。

为了防止这种情况,我添加了一个简单的文档版本控制系统:在模式上检查文档的版本是否有效(即不高于客户端上次读取的版本)。 乍一看,它工作正常:

// Validate version number UserSchema.pre("save", function(next) { var user = this user.constructor.findById(user._id, function(err, userCurrent) { // userCurrent is the user that is currently in the db if (err) return next(err) if (userCurrent == null) return next() if(userCurrent.docVersion > user.docVersion) { return next(new Error("document was modified by someone else")) } else { user.docVersion = user.docVersion + 1 return next() } }) }) 

问题如下:

当两个客户端应用程序同时保存一个用户文档时,是否有可能在预挂钩和实际保存操作之间交叉? 我的意思是以下,想象从左到右的时间,v是版本号(这是通过保存):

 App1: findById(pre)[v:1] save[v->2] App2: findById(pre)[v:1] save[v->2] 

导致App1保存了一些已经被修改的东西(通过App2),并且无法注意到它被修改了。 App2的更新完全丢失。

我的问题可能归结为:Mongoose pre-hook和save方法是在一个primefaces步骤中发生的吗?

如果不是的话,你能给我一个关于如何解决这个问题的build议,以免更新丢失?

谢谢!

MongoDB具有findAndModify ,对于单个匹配的文档,它是一个primefaces操作。

Mongoose有各种使用这种方法的方法,我认为它们将适合你的用例:

  • Model.findOneAndUpdate()
  • Model.findByIdAndUpdate()
  • Model.findOneAndRemove()
  • Model.findByIdAndRemove()

另一个解决scheme(Mongoose本身也用于其自己的文档版本 )也是使用更新文档(如果是当前模式)。