![](/img/trans.png)
[英]Mongoose VersionError: No matching document found for id when document is being saved
[英]Mongoose Error: `{“message”:“No matching document found.”,“name”:“VersionError”}`
我一直在尝试弄清楚为什么我的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"}
而且我不知道为什么。 当我尝试在猫鼬调用中执行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({versionKey:'myVersionKey',...
我也尝试将.save()
函数更改为.update()
因为有人在网上建议使用它,但这似乎给了我更多的错误。 任何想法如何解决这一问题? 那将不胜感激!
看一下下面的语法:
$scope.currentUser = {
'eventsAttending' = [];
}
我相当确定这样的JSON结构内部的赋值会导致错误,尤其是当您尝试将该结构引入MongoDB时。
我认为您可能遇到的问题(例如,当我从类似的操作中得到此错误时)是在第一次更新后,新更新的文档上的'__v'VersionKey属性已更改,但您可能没有更新浏览器中具有的对象的属性。 因此,当您再次对其进行更新时,您将发送旧的'__v'VersionKey,(即使您更新了'eventsAttending'属性),并且该文档与较新的VersionKey相冲突。 假设Auth.getCurrentUser();
函数从mongo返回整个文档对象。
我要做的就是简单地添加delete entity.__v;
在与请求一起发送之前,从文档中删除旧的VersionKey。 更好的是,我建议您在返回文档时更新API发送回的属性,这样一来就不会发生此问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.