使用 Mongoose 的 Node.js 和 MongoDB。无法使用 findByIdAndUpdate 增加文档版本

Posted

技术标签:

【中文标题】使用 Mongoose 的 Node.js 和 MongoDB。无法使用 findByIdAndUpdate 增加文档版本【英文标题】:Node.js and MongoDB using Mongoose. Unable to increment doc version using findByIdAndUpdate 【发布时间】:2018-06-14 23:54:16 【问题描述】:

我目前面临一个问题,当两个人在我的 Angular 应用程序中的同一页面上工作时,他们会互相覆盖。我可以看到的问题是文档版本没有增加,因此 mongo 不会检查文档版本是新的还是旧的。有人可以指导我如何解决这个问题。下面是我的代码 sn-p。

    var art = new Article(pageBody);
    Article.findByIdAndUpdate(art._id, pageBody,  new: true, upsert: true,$inc: art.v: 1 , function(err, model) 
      console.log(art.__v);
      // NOTE: new page will never happen here, moved to issue controller
      if (err) 
        err = 
          source: 'Article.findByIdAndUpdate',
          bodyPageId: pageBody._id,
          articleId: art._id,
          message: err.message,
          err: err.toString()
        ;
      
      cb(err);
    );
   else 
    console.log(art.__v);
    cb();
  

【问题讨论】:

【参考方案1】:

在查询的更新部分,上下文不是本地文章实例,而是找到的文档,因此您想像这样更新:

 $inc:  v: 1  

使用您当前的代码,MongoDB 在您的文章中创建一个名为 "art" 的新子文档,其中包含一个名为 "v" 的字段,这不是您想要的:


  art: 
    v: 1
  

【讨论】:

感谢您的回复。效果很好,但是我注意到该函数实际上并没有对版本进行错误处理,例如假设您更新模型或数据它将是 v2 但如果我也更新模型而不刷新它也是 v2 但您的数据已被删除。知道如何使用内置版本控制的 Mongodbs 吗? 我不确定我是否理解...?! 对此感到抱歉。我的意思是有一个场景,我创建了一个 cms,用户可以使用它来创建 html 页面,比如杂志。现在,当两个人在同一个页面上工作时,不会出现错误或警告向人们显示他们的更改已过时。我的意思是第一个用户的 versionkey 是 3,第二个用户是 1。由于一个小于 3,他们应该收到一条错误消息,指出除非刷新,否则无法保存。 对我来说这听起来更像是一个应用程序/错误处理主题。您应该能够构建一些东西来很好地支持这些场景b) 使用 Websockets (dontpanicblog.co.uk/2016/04/17/…) 通知您的客户同时编辑您的文档。

以上是关于使用 Mongoose 的 Node.js 和 MongoDB。无法使用 findByIdAndUpdate 增加文档版本的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Node.js 和 Mongoose 插入 MongoDB

使用 Mongoose、Node.js 和 Underscore 生成代码的简单方法?

使用 Node.js 和 Mongoose 将查询结果保存到模型/模式的属性

单个node.js项目中的Mongoose和多个数据库

单个node.js项目中的Mongoose和多个数据库

如何让 node.js 使用 mongoose 连接到 mongolab