Mongoose:增加我的文档版本号不起作用,我在尝试保存时遇到版本错误

Ada*_*ner 5 javascript mongoose mongodb node.js

当我尝试保存我的文档时,我收到一个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);
    });
  });
};
Run Code Online (Sandbox Code Playgroud)

产量

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' }
Run Code Online (Sandbox Code Playgroud)

Exp*_*lls 4

这里的问题与使用__v并尝试手动更新它有关。 .increment实际上并不立即执行增量,但它确实为模型设置了一个内部标志来处理增量。我找不到任何关于 的文档.increment,所以我认为它可能供内部使用。问题源于除了.extend使用.__vdocument.__v++.increment

当您使用_.extend它时,将属性直接复制__v到对象上,这似乎会导致问题,因为 Mongoose 在内部无法找到旧版本。我没有深入挖掘以找出具体原因,但您也可以通过添加来绕过它delete req.body.__v

您还可以使用.findByIdAndUpdate. 请注意,这不会内部使用__v或增加它。正如其他答案和链接的错误所示,如果您想在更新期间增加版本,则必须手动执行此操作。