MongooseJS 未正确保存到数组
Posted
技术标签:
【中文标题】MongooseJS 未正确保存到数组【英文标题】:MongooseJS Not saving to array properly 【发布时间】:2014-10-10 20:48:12 【问题描述】:我想将一个值附加到我的 Mongoose 数组中,但我的数组似乎永远不会更新。我执行以下操作:
在我的控制器中,我将 eventName 附加到数组 eventsAttending
中,如下所示:
$scope.currentUser.eventsAttending.push(event.eventName);
$http.put('/api/users/' + $scope.currentUser._id, $scope.currentUser)
.success(function(data)
console.log("Success. User " + $scope.currentUser.name);
);
我尝试像这样更新数组:
// Updates an existing event in the DB.
exports.update = function(req, res)
if(req.body._id) delete req.body._id;
User.findById(req.params.id, function (err, user)
if (err) return handleError(res, err);
if(!user) return res.send(404);
user.markModified('req.body.eventsAttending');
user.save(function (err)
if (err) return handleError(res, err);
return res.json(200, user);
);
);
;
但我的数组似乎永远不会更新。我还尝试了以下方法:
// Updates an existing event in the DB.
exports.update = function(req, res)
if(req.body._id) delete req.body._id;
User.findById(req.params.id, function (err, user)
if (err) return handleError(res, err);
if(!user) return res.send(404);
var updated = _.merge(user, req.body);
updated.markModified('eventsAttending');
updated.save(function (err)
if (err) return handleError(res, err);
return res.json(200, user);
);
);
;
使用这种方法,我的数组可以正确更新,但是当我尝试在一次之后执行 http put 时,我收到一条错误消息 Error: [VersionError: No matching document found.] message: 'No matching document found.', name: 'VersionError'
这是我的用户架构:
var UserSchema = new Schema(
name: String,
username: String,
eventsAttending: [ type: String, ref: 'Event'],
);
如果有人可以提供帮助,将不胜感激。
【问题讨论】:
【参考方案1】:我的猜测是从 _.merge 返回的对象不再是 Mongoose 模型,并且一些信息在转换中丢失了。我会尝试手动设置来自请求的所有字段并使用events.attending.push()
添加到数组中,然后保存更新的对象并看看会发生什么。
您使用 markModified 的第一个示例看起来是错误的。查看文档,它应该是被修改的字段的名称,并且您似乎已经为其放置了源位置。
user.markModified('user.eventsAttending')
但是,如果您使用 push 方法,则不需要这样做,因为 Mongoose 会覆盖内置数组函数来跟踪更改。
【讨论】:
嗨,有趣的是,例如,当我执行req.body.name = "New Name"
之类的操作然后执行var updated = _.merge(user, req.body);
调用并保存它时,名称似乎正确更新但数组似乎从未更新。知道为什么吗?
Mongoose 带回来的 Model 对象非常复杂。它跟踪脏字段,并为您返回一个专门版本的数组对象,该版本修改 push 和 pop 等方法以跟踪更改。我的猜测是在 _.merge 调用之后,你得到的只是一个标准数组。 mongoosejs.com/docs/api.html#types-array-js
是的,我会玩这个。我非常感谢您所付出的帮助和努力。非常感谢!我想我现在已经更好地处理了这个问题。 :)以上是关于MongooseJS 未正确保存到数组的主要内容,如果未能解决你的问题,请参考以下文章