猫鼬:增加我的文档版本号不起作用,我在尝试保存时遇到版本错误
Mongoose: Incrementing my documents version number doesn't work, and I'm getting a Version Error when I try to save
当我尝试保存文档时,出现 VersionError: No matching document found
错误,类似于 this SO 问题。
阅读 this 博客 post 后,问题似乎出在我的文档的版本控制上。我弄乱了一个数组,所以我需要更新版本。
但是,调用 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' }
版本控制的实施是为了缓解 doc.save()
设计(而非 Model.update 等)。但如果你愿意,你可以尝试以下方法:
{$set: {dummy: [2]}, $inc: { __v: 1 }}
然而,根据 link
,这是一个已确认的错误
请根据上述问题的里程碑验证您的 mongoose 版本。
谢谢:)
此处的问题与使用 __v
并尝试手动更新有关。 .increment
实际上并没有立即执行递增,但它确实为模型设置了一个内部标志来处理递增。我找不到关于 .increment
的任何文档,所以我认为它可能供内部使用。问题源于尝试将 .extend
与已经具有 __v
的对象组合(顺便说一下,有两个下划线,而不是 document.__v++
无论如何都会在内部影响模型)除了使用 .increment
.
当您使用 _.extend
时,它会将 __v
属性 直接复制到对象上,这似乎会导致问题,因为 Mongoose 无法在内部找到旧版本。我没有深入挖掘以找出具体原因,但您也可以通过添加 delete req.body.__v
.
来绕过它
除了查找和保存两个步骤,您还可以使用 .findByIdAndUpdate
。请注意,这 而不是 使用 __v
或在内部递增它。正如其他答案和链接的错误所示,如果您想在更新期间增加版本,您必须手动进行。
当我尝试保存文档时,出现 VersionError: No matching document found
错误,类似于 this SO 问题。
阅读 this 博客 post 后,问题似乎出在我的文档的版本控制上。我弄乱了一个数组,所以我需要更新版本。
但是,调用 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' }
版本控制的实施是为了缓解 doc.save()
设计(而非 Model.update 等)。但如果你愿意,你可以尝试以下方法:
{$set: {dummy: [2]}, $inc: { __v: 1 }}
然而,根据 link
,这是一个已确认的错误请根据上述问题的里程碑验证您的 mongoose 版本。
谢谢:)
此处的问题与使用 __v
并尝试手动更新有关。 .increment
实际上并没有立即执行递增,但它确实为模型设置了一个内部标志来处理递增。我找不到关于 .increment
的任何文档,所以我认为它可能供内部使用。问题源于尝试将 .extend
与已经具有 __v
的对象组合(顺便说一下,有两个下划线,而不是 document.__v++
无论如何都会在内部影响模型)除了使用 .increment
.
当您使用 _.extend
时,它会将 __v
属性 直接复制到对象上,这似乎会导致问题,因为 Mongoose 无法在内部找到旧版本。我没有深入挖掘以找出具体原因,但您也可以通过添加 delete req.body.__v
.
除了查找和保存两个步骤,您还可以使用 .findByIdAndUpdate
。请注意,这 而不是 使用 __v
或在内部递增它。正如其他答案和链接的错误所示,如果您想在更新期间增加版本,您必须手动进行。