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 未正确保存到数组的主要内容,如果未能解决你的问题,请参考以下文章

C++,布尔数组未正确初始化

MongooseJS 在填充后返回空数组

MongooseJS - 限制子文档中的文档数量

如何将NSMutable数组附加到现有文件中

mongoosejs 定义复杂模型

保存按钮未附加到右侧信息窗口,谷歌地图