最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Mongoose VersionError: No matching document found for id when document is being saved - Stack Overflow

programmeradmin2浏览0评论

I am repeatedly seeing the following error when synchronizing a users cart through a "/sync/" API request. This is called whenever a user changes the contents of their shopping cart.

VersionError: No matching document found for id "2y4b1hq601cd013e0af25e32" version 4 modifiedPaths "cart, cart.items, cart.updatedAt" at VersionError.MongooseError [as constructor] (/node_modules/mongoose/lib/error/mongooseError.js:13:11) at new VersionError (/node_modules/mongoose/lib/error/version.js:18:17) at generateVersionError (/node_modules/mongoose/lib/model.js:398:10) at model.Model.save (/node_modules/mongoose/lib/model.js:460:27) at /controllers/shoppingCart/index.js:48:14 at /node_modules/mongoose/lib/model.js:4670:16 at /node_modules/mongoose/lib/utils.js:258:16 at _hooks.execPost (/node_modules/mongoose/lib/query.js:4065:11) at /node_modules/kareem/index.js:135:16 at process._tickCallback (internal/process/next_tick.js:61:11)

The exact code line is the following:

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

I've tried user.increment() but this doesn't seem to fix this, nor deleting user.__v I am assuming this is conflicting versions, and I want versioning on my user objects, I just need to force the cart to always sync to the latest version.

I am repeatedly seeing the following error when synchronizing a users cart through a "/sync/" API request. This is called whenever a user changes the contents of their shopping cart.

VersionError: No matching document found for id "2y4b1hq601cd013e0af25e32" version 4 modifiedPaths "cart, cart.items, cart.updatedAt" at VersionError.MongooseError [as constructor] (/node_modules/mongoose/lib/error/mongooseError.js:13:11) at new VersionError (/node_modules/mongoose/lib/error/version.js:18:17) at generateVersionError (/node_modules/mongoose/lib/model.js:398:10) at model.Model.save (/node_modules/mongoose/lib/model.js:460:27) at /controllers/shoppingCart/index.js:48:14 at /node_modules/mongoose/lib/model.js:4670:16 at /node_modules/mongoose/lib/utils.js:258:16 at _hooks.execPost (/node_modules/mongoose/lib/query.js:4065:11) at /node_modules/kareem/index.js:135:16 at process._tickCallback (internal/process/next_tick.js:61:11)

The exact code line is the following:

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

I've tried user.increment() but this doesn't seem to fix this, nor deleting user.__v I am assuming this is conflicting versions, and I want versioning on my user objects, I just need to force the cart to always sync to the latest version.

Share Improve this question edited Feb 20, 2019 at 18:45 dpapadopoulos 1,8465 gold badges25 silver badges36 bronze badges asked Feb 20, 2019 at 18:09 dacopenhagendacopenhagen 2,5102 gold badges23 silver badges29 bronze badges
Add a comment  | 

2 Answers 2

Reset to default 20

While it would appear a .save() is the right approach here, an .update() command would get the job done while ignoring "race conditions" that cause this error to occur. Mongo DB is throwing this error because it is concerned that I am saving an older version of the document that has already been updated:

  1. v1 is sent to client
  2. v1 is saved, and updated to v2 in Mongo DB
  3. v1 is trying to be saved again, but Mongo DB already has v2 stored, error is thrown

A better approach is to send v1 to the client and when the cart object changes, synchronize the object with the new cart object no matter what. This can be done via .update() rather than through .save().

This is because .save() watches and cares about version controls, while .update() will update the object regardless of version control.

It was failing for me because _id field of a document that I fetched and tried to update was stored in the db as a string, not ObjectId.
Check what is that particular user._id datatype.

If it is string - you'll need to insert new document and remove that existing one to fix it, since _id field is immutable.

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论