Mongoose错误:`{“message”:“找不到匹配的文档”,“name”:“VersionError”}`

我一直试图弄清楚为什么我的HTTP Put一直没有工作后,我使用一次。 当我点击一个button时,我将当前用户的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 Putfunction是这样的:

 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页面中,我有多个事件可以参加,每个事件都有一个名为$scope.attending的button,我调用$scope.attending ,函数被调用并发生HTTP Put。 所有这些都适用于我select参加的第一个活动。 但是,当我单击另一个事件的Attendbutton时,我得到一个错误,说:

{"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来解决这个问题,因为我做了一些Googlesearch,但我不断收到一个错误,说:

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

在添加到我的模式中:

var UserSchema = new Schema({versionKey:'myVersionKey',…

我也尝试将.save()函数更改为.update()因为有人在网上提示它,但似乎给了我更多的错误。 任何想法如何解决这一问题? 这将不胜感激!

看看你的语法就行了:

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

在JSON结构中,我相当肯定地指派了这样的内容,这可能会导致错误,尤其是当您尝试将该结构引入MongoDB时。

我认为你可能遇到的问题(就像我从类似的行为中得到这个错误的情况那样)是在第一次更新之后,新更新的文档上的'__v'VersionKey属性发生了变化,但是你可能不会更新浏览器中的对象的属性。 所以,当你再次更新它时,你发送了旧的'__v'VersionKey(即使你更新了'eventsAttending'属性),这个文档与新的VersionKey冲突。 这将假定Auth.getCurrentUser(); 函数从mongo返回整个文档对象。

我所做的只是添加delete entity.__v; 在发送请求之前从文档中删除旧的VersionKey。 更好的是,我build议在返回文档时更新API返回的属性,所以这个问题首先不会发生。