【问题标题】:Mongoose: Incrementing my documents version number doesn't work, and I'm getting a Version Error when I try to saveMongoose:增加我的文档版本号不起作用,当我尝试保存时出现版本错误
【发布时间】:2015-07-22 05:33:29
【问题描述】:

当我尝试保存我的文档时,我收到了 VersionError: No matching document found 错误,类似于 this SO 问题。

阅读this 的博文后,似乎问题出在我的文档的版本控制上。我弄乱了一个数组,所以我需要更新版本。

但是,拨打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' }

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

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

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

    除了查找和保存两个步骤,您还可以使用.findByIdAndUpdate。请注意,这使用__v 或在内部增加它。正如其他答案和链接的错误所表明的那样,如果您想在更新期间增加版本,则必须手动进行。

    【讨论】:

      【解决方案2】:

      实施版本控制以通过设计(不是 Model.update 等)缓解doc.save()。但是,如果您愿意,可以尝试以下方法:

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

      但是,根据link,这是一个已确认的错误

      请从上述问题的里程碑验证您的猫鼬版本。

      谢谢:)

      【讨论】:

      • “版本控制是为了减轻 doc.save() 的设计(不是 Model.update 等)”——我不明白这意味着什么。 “已确认错误” - 看起来像是在谈论 updatefindByIdAndUpdate,但我没有做任何一个(我在我的问题中错误地使用了“更新”这个词,但我的代码显示我'我打电话给save())
      猜你喜欢
      • 2014-01-10
      • 2023-03-22
      • 2019-02-13
      • 2020-07-11
      • 2021-05-29
      • 2018-05-22
      • 2021-09-28
      • 1970-01-01
      • 2018-03-12
      相关资源
      最近更新 更多