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

时间:2017-07-20 18:51:40

标签: javascript node.js mongodb csv mongoose

上下文:我有一个Post Mongoose模型,其中包含一个csv_files数组字段来存储csv字符串。我从其他网络应用发出fetch API请求,以便为特定Post发布csv字符串。

以下代码会产生错误

  

UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:2):VersionError:找不到匹配的文档ID" 5966932399e969ad8013bedf"

router.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数组中而不会出现错误?

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

我从正文的更新请求中删除了版本属性。

删除必填项。__v;

答案 2 :(得分:0)

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

如果有人遇到更好的解决方案,我会等待将此标记为答案。

答案 3 :(得分:0)

仅在此处评论我的问题显然是什么。

错误消息:

  

消息:“找不到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))
        });

    }

我的参数“数据”已经是一个Mongoose对象,我正在创建一个新对象并尝试 save()。就像@dacopenhagen所说的那样, save()检查文档的版本,并引发VersionError错误。

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

var session = new Session(data);

我希望有帮助。