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' }
这里的问题与使用__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版本。
谢谢 :)