繁体   English   中英

Mongoose - 版本错误:找不到与 id 匹配的文档

[英]Mongoose - Version Error: No matching document found for id

上下文:我有一个Post Mongoose model,其中包含一个csv_files数组字段来存储 csv 个字符串。 我从不同的 web 应用程序发出fetch API 请求,以 POST 特定Post的 csv 字符串。

下面的代码会产生错误

UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): VersionError: No matching document found for id“5966932399e969ad8013bedf”

路由器.js

router.post('/posts/:url/upload-csv/:csv_name', (req, res) => {
  let csv_name = req.params.csv_name;
  let csv_string = csv_name+req.body.csv_string;

  Post.findOne({url: req.params.url})
    .then((post) => {
      if (post.csv_files.length === 0) {
        post.csv_files.push(csv_string);
      } else {
        let foundExistingCSV = false;
        for (var i = 0; i < post.csv_files.length; i++) {
          if (post.csv_files[i].includes(csv_name)) {
            foundExistingCSV = true;
            post.csv_files[i] = csv_string;
            break;
          }
        }
        if (!foundExistingCSV) post.csv_files.push(csv_string);
      }

      post.markModified('csv_files');
      post.save();

      return res.status(200);
    })
    .catch((err) => {
      console.log(err);
      return res.status(400);
    });
});

模型/post.js

const mongoose    = require('mongoose');

var stringPreset = {
  type: String,
  uppercase: true
}

var Post = mongoose.model('Post', {
  name                 : stringPreset,
  url                  : String,
  password             : String,
  csv_files            : { type : Array , "default" : [] },
  updatedAt            : { type: Date, default: Date.now }
});

module.exports = { Post };

我该如何解决这个问题,以便将文档保存到csv_files数组中而不会出现错误?

将对象保存到 Mongo DB 时,您必须了解 Mongo DB 具有适当的版本控制系统。 这有助于确保如果您保存一个对象,再次保存它时您最终不会覆盖以前保存的数据。

这是您看到的错误。 如果您想在此特定实例中不考虑版本控制而强制更新对象,您可能需要使用.update()代替。 这将强制更新对象,而不管其当前保存的状态如何。

这是因为.save()监视并关心版本控制,而.update()将更新对象而不管版本控制。

我从 body 的更新请求中删除了 version 属性。

删除 req.body.__v;

虽然 a.save() 在这里似乎是正确的方法,但 an.update() 命令可以完成工作,同时忽略导致此错误发生的“竞争条件”。 Mongo DB 抛出此错误,因为它担心我正在保存已更新的文档的旧版本:

v1 被发送到客户端 v1 被保存,并在 Mongo DB 中更新为 v2 v1 试图再次保存,但 Mongo DB 已经存储了 v2,抛出错误更好的方法是将 v1 发送到客户端,当购物车 object更改,无论如何将 object 与新购物车 object 同步。 这可以通过.update() 而不是通过.save() 来完成。

这是因为 .save() 监视并关心版本控制,而 .update() 将更新 object 而不管版本控制。

看起来@robertklep 是对的。 我通过将第一个 API 调用包装在Promise ,然后在第一个 API 调用完成后执行第二个 API 调用来解决我的问题。

我将等待将此标记为答案,以防万一有人遇到更好的解决方案。

只是在这里评论我的问题显然是什么。

错误信息:

消息:'没有找到与 id“5c86d3a15bbcb965d85d80d1”版本 3 匹配的文档',名称:'VersionError',版本:3

我的代码:

update: function (data) {

        var session = new Session(data);
        database.logging("INFO", "session-update", session.cid, session.order.orderNumber);
        return new Promise(function (resolve, reject) {

            session.save()
                .then(savedSession => resolve(savedSession))
                .catch(savedSessionError => reject(savedSessionError))
        });

    }

我的参数 'data' 已经是一个 Mongoose 对象,我正在创建一个新对象并尝试save()它。 所以就像@dacopenhagen 所说的, save()检查文档的版本并且它抛出一个 VersionError 错误。

我如何修复它只需删除Session()对象的创建。 删除了这一行

var session = new Session(data);

我希望这会有所帮助。

我得到了同样的错误。 我使用了 findone.exec()。 它对我有用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM