Mongoose:递增我的文档版本号不起作用,并且当我尝试保存时出现版本错误

当我试图保存我的文档,我得到一个VersionError: No matching document found错误,类似于这个问题。

看完这个博客后,似乎问题是与我的文档的版本。 我搞乱了一个数组,所以我需要更新版本。

但是,调用document.save()不适合我。 当我在save()的调用之前和之后注销文档时, document._v是一样的东西。

我也试过做document._v = document._v++这也没有工作。


 exports.update = function(req, res) { if (req.body._id) { delete req.body._id; } User.findById(req.params.id, function(err, user) { if (err) return handleError(res, err); if (!user) return res.send(404); var updated = _.extend(user, req.body); // doesn't increment the version number. causes problems with saving. see http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html console.log('pre increment: ', updated); updated.increment(); // updated._v = updated._v++; console.log('post increment: ', updated); updated.save(function(err) { if (err) return handleError(res, err); return res.json(200, user); }); }); }; 

产量

 pre increment: { _id: 5550baae1b571aafa52f070c, provider: 'local', name: 'Adam', email: 'azerner3@gmail.com', hashedPassword: '/vahOqXwCwKQKtcV3KBQeFge/YB0xtqOj+YDyck7gzyALA/IP7u7BfqQhlVHBQT26//XfBTkaOCK2bQXg65OzA==', salt: 'MvzXW7D4xuyGQBJNeFRoUg==', __v: 32, drafts: [], starredSkims: [], skimsCreated: [ 5550cfdab8dcacd1a7892aa4 ], role: 'user' } post increment: { _id: 5550baae1b571aafa52f070c, provider: 'local', name: 'Adam', email: 'azerner3@gmail.com', hashedPassword: '/vahOqXwCwKQKtcV3KBQeFge/YB0xtqOj+YDyck7gzyALA/IP7u7BfqQhlVHBQT26//XfBTkaOCK2bQXg65OzA==', salt: 'MvzXW7D4xuyGQBJNeFRoUg==', __v: 32, drafts: [], starredSkims: [], skimsCreated: [ 5550cfdab8dcacd1a7892aa4 ], role: 'user' } 

       

网上收集的解决方案 "Mongoose:递增我的文档版本号不起作用,并且当我尝试保存时出现版本错误"

这里的问题与使用__v并尝试手动更新有关。 .increment实际上不会立即执行增量,但它会为模型设置一个内部标志来处理增量。 我找不到.increment任何文档,所以我认为它可能是内部使用。 这个问题源于尝试结合.extend与一个已经有__v的对象(有两个下划线的方式,而不是document.__v++内部影响模型)除了使用.increment

当你使用_.extend它直接复制__v属性到对象上,这似乎会导致问题,因为Mongoose在内部找不到旧版本。 我没有足够深入地find为什么这是特定的,但你可以通过添加delete req.body.__v来解决它。

您可以使用.findByIdAndUpdate查找并保存为两个步骤。 请注意,这不会使用__v或在内部增加它。 正如另一个答案和链接的错误表明,如果你想增加更新的版本,你必须手动。

版本控制是为了减轻doc.save()的devise(而不是Model.update等)。 但是如果你想要,你可以尝试下面的代码:

 {$set: {dummy: [2]}, $inc: { __v: 1 }} 

然而,这是一个确认错误根据链接

请从上述问题的里程碑validation您的mongoose版本。

谢谢 :)