Mongoose 错误:`"message":"No matching document found.","name":"Vers

Posted

技术标签:

【中文标题】Mongoose 错误:`"message":"No matching document found.","name":"VersionError"`【英文标题】:Mongoose Error: `"message":"No matching document found.","name":"VersionError"`Mongoose 错误:`"message":"No matching document found.","name":"VersionError"` 【发布时间】:2014-10-08 09:17:00 【问题描述】:

我一直在试图弄清楚为什么我的 HTTP Put 在我使用一次后一直没有工作。当我点击一个按钮时,我将当前用户的 id 推送到一个数组中,如下所示:

$scope.currentUser = 
  'eventsAttending' = [];


$scope.attending = function(event, id)

  if($cookieStore.get('token'))
    $scope.currentUser = Auth.getCurrentUser();
  
  $scope.currentUser.eventsAttending.push(event._id);
  $http.put('/api/users/' + $scope.currentUser._id, $scope.currentUser)
    .success(function(data)
      console.log("Success. User " + $scope.currentUser.name);
    );

而我的 HTTP Put 函数是这样的:

var express = require('express');
var controller = require('./user.controller');
var config = require('../../config/environment');
var auth = require('../../auth/auth.service');
router.get('/:id', controller.getEvents);

var router = express.Router();

exports.update = function(req, res) 
  if(req.body._id)  delete req.body._id; 
  User.findById(req.params.id, function (err, user) 
    if (err)  return res.send(500, err); 
    if(!user)  return res.send(404); 
    var updated = _.merge(user, req.body);
    updated.markModified('eventsAttending');
    updated.save(function (err) 
      if (err)  return res.send(500, err); 
      return res.json(200, user);
    );
  );
;

在我的 html 页面中,我可以参加多个活动,每个活动都有一个名为 Attend 的按钮,我在其中调用 $scope.attending 并调用该函数并发生 HTTP Put。所有这些都适用于我选择参加的第一个活动。但是,当我单击另一个事件的 Attend 按钮时,我收到一条错误消息:

"message":"No matching document found.","name":"VersionError"

我也不知道为什么。当我尝试在 mongoose 调用中执行 updated.save() 并得到 res.send(500, err)

时发生错误

我尝试查看http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html 来解决问题,因为我做了一些谷歌搜索,但我不断收到一条错误消息:

Undefined type at `versionKey` 
Did you try nesting Schemas? You can only nest using refs or arrays.

添加到我的架构后:

var UserSchema = new Schema( 版本密钥:'我的版本密钥', ...

我还尝试将.save() 函数更改为.update(),正如网上有人建议的那样,但这似乎给了我更多错误。任何想法如何解决这一问题?那将不胜感激!

【问题讨论】:

【参考方案1】:

我认为您可能遇到的问题(就像我从类似操作中收到此错误的情况一样)是在第一次更新后,新更新文档上的 '__v' VersionKey 属性已更改,但您可能不会更新您在浏览器中拥有的对象的该属性。因此,当您再次更新它时,您将发送旧的“__v”VersionKey(即使您更新了“eventsAttending”属性)并且该文档与较新的VersionKey 冲突。这将假定 Auth.getCurrentUser(); 函数从 mongo 返回整个文档对象。

我为解决这个问题所做的只是简单地添加delete entity.__v; 以从文档中删除旧的 VersionKey,然后再将其与请求一起发送。更好的是,我建议在返回文档时更新您的 API 发回的属性,这样一开始就不会发生此问题。

【讨论】:

以上是关于Mongoose 错误:`"message":"No matching document found.","name":"Vers的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose - 由 :: 11000 E11000 重复键错误索引引起?

Mongoose - 由 :: 11000 E11000 重复键错误索引引起?

NodeJS Mongoose抛出一个错误。"证书链中的自签名证书"

Mongoose .save() 返回空错误对象,不保存在数据库中

Node.js/Mongoose 上的“版本错误:未找到匹配的文档”错误

Mongoose 错误:“拓扑被破坏”,有啥问题?