MongooseJS没有正确保存到数组

时间:2014-08-18 00:17:53

标签: javascript arrays node.js angularjs mongoose

我想在我的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' }

这是我的UserSchema:

var UserSchema = new Schema({
  name: String,
  username: String,
  eventsAttending: [{ type: String, ref: 'Event'}],
});

如果有人可以提供帮助,那将非常感激。

1 个答案:

答案 0 :(得分:0)

我的猜测是从_.merge返回的对象不再是Mongoose模型,并且某些信息在变换中丢失了。我会尝试手动设置来自请求的所有字段,并使用events.attending.push()添加到数组,然后保存更新的对象,看看会发生什么。

您使用markModified的第一个示例看起来不对。查看文档时,它应该是已修改字段的名称,并且您似乎已为其提供源位置。

user.markModified('user.eventsAttending')

但是,如果使用push方法,则不需要这样做,因为Mongoose会覆盖内置数组函数来跟踪更改。