Mongoose VersionError:保存文档时找不到ID为ID的匹配文档

时间:2019-02-20 18:09:41

标签: javascript node.js mongodb mongoose

通过“ / sync /” API请求同步用户购物车时,我反复看到以下错误。每当用户更改购物车的内容时,就会调用此方法。

  

VersionError:找不到与ID相匹配的文档   “ 2y4b1hq601cd013e0af25e32”第4版经过修改的路径“购物车,cart.items,   cart.updatedAt”       在VersionError.MongooseError [作为构造函数](/node_modules/mongoose/lib/error/mongooseError.js:13:11)       在新的VersionError(/node_modules/mongoose/lib/error/version.js:18:17)       在generateVersionError(/node_modules/mongoose/lib/model.js:398:10)       在model.Model.save(/node_modules/mongoose/lib/model.js:460:27)       在/controllers/shoppingCart/index.js:48:14       在/node_modules/mongoose/lib/model.js:4670:16       在/node_modules/mongoose/lib/utils.js:258:16       在_hooks.execPost(/node_modules/mongoose/lib/query.js:4065:11)       在/node_modules/kareem/index.js:135:16       在process._tickCallback(internal / process / next_tick.js:61:11)

确切的代码行如下:

req.session.save();
delete user.__v;
>>      user.save();
return res.send();

我已经尝试过user.increment(),但是这似乎不能解决这个问题,也不能删除user .__ v。我假设这是相互冲突的版本,并且想要对用户对象进行版本控制,我只需要强制执行购物车以始终同步到最新版本。

1 个答案:

答案 0 :(得分:1)

虽然此处显示 .save()是正确的方法,但 .update()命令将完成工作,而忽略了“竞争条件”导致发生此错误。 Mongo DB引发此错误,因为它担心我要保存已更新的旧版本文档:

  1. v1发送给客户端
  2. v1已保存,并已在Mongo DB中更新为v2
  3. v1试图再次保存,但是Mongo DB已经存储了v2,引发了错误

一种更好的方法是将v1发送到客户端,并且当购物车对象发生更改时,无论如何,都要将该对象与新的购物车对象同步。可以通过 .update()来完成,而不是通过 .save()

这是因为 .save()会监视并关心版本控制,而 .update()会更新对象,而不考虑版本控制。