Mongoose VersionError:保存文档时未找到与 id 匹配的文档

Posted

技术标签:

【中文标题】Mongoose VersionError:保存文档时未找到与 id 匹配的文档【英文标题】:Mongoose VersionError: No matching document found for id when document is being saved 【发布时间】:2019-07-14 12:30:28 【问题描述】:

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

VersionError: 找不到与 id 匹配的文档 "2y4b1hq601cd013e0af25e32" 版本 4 modifiedPaths "cart, cart.items, 购物车.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】:

虽然这里看起来 .save() 是正确的方法,但 .update() 命令会在忽略“竞争条件”的情况下完成工作导致发生此错误。 Mongo DB 抛出此错误,因为它担心我保存的是已更新的旧版本文档:

    v1 发送给客户端 v1 已保存,并在 Mongo DB 中更新为 v2 v1 正在尝试再次保存,但 Mongo DB 已经存储了 v2,抛出错误

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

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

【讨论】:

千万次:D 我正在尝试这个,因为我有同样的错误,但由于某种原因,集合仍然是空的。我想澄清一下,我正在尝试将原始集合的一些文档复制到新数据库;一开始我使用 model.save() 并开始抛出版本错误并将其更改为 model.updateOne() 但现在新集合是在新数据库上创建的,但它仍然是空的。你知道是什么导致了这种行为吗?

以上是关于Mongoose VersionError:保存文档时未找到与 id 匹配的文档的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose VersionError:保存文档时未找到与 id 匹配的文档

Node.js/Mongoose 上的“版本错误:未找到匹配的文档”错误

Mongoose 错误:`"message":"No matching document found.","name":"Vers

mongoose的增删改查操作

Node JS mongoose 创建博文评论系统

Nosql / mongoose——设计[重复]