如何更新一个对象的属性,它本身就是一个有角度的数组对象(猫鼬)

时间:2015-10-22 06:50:26

标签: angularjs mongoose mean-stack yeoman-generator-angular

这是我的架构的一部分:

var IdeaSchema = new Schema({
  ratings: [{rater: String, star: Number}]

我正在尝试将评级添加到评级数组中,如下所示:

$http.put('/api/ideas/' + idea._id, {ratings: [{rater: 'John', star: 5}] });

第一次放置后,较新的评级会覆盖阵列,我总是拥有最新的评级。我尝试了建议的扩展(this is the main issue i think)而不是合并但它似乎不起作用..我不确定我是否使用正确的语法调用api关于参数评级。我的更新方法是生成一个yeoman( generator-angular-fullstack ):

exports.update = function(req, res) {
  ...
  var updated = _.merge(idea, req.body);
  updated.save(function (err) {
    ..
    return res.json(200, idea);
  });

修改

我通过改变这个api来实现它:

$http.put('/api/ideas/' + idea._id + '/ratings', {rater: 'John', star: 5} );

我现在可以确切地告诉我想要更新的内容。所以这是我的想法的评级数组。控制器中的一种新方法:

router.put('/:id/ratings', auth.isAuthenticated(), controller.addRating);

exports.addRating = function(req, res) {
  ...
    idea.ratings.push(req.body);
    idea.save(function (err) {
      ...
  });
};

我怀疑这是否是实现这一目标的最佳方法。也许更好的api或更好的函数可以使用生成的经典更新方法来处理这个问题。

1 个答案:

答案 0 :(得分:0)

我会做这样的事情。

return Promise.cast(Idea.findOne({_id: idea._id, 'ratings.rater': rating.name}).exec())
.then(function(d){
    if (d) {
      return Promise.cast(Idea.update({_id: idea._id, 'ratings.rater': rating.name}, {$set : {'ratings.$' : rating}}).exec());
    } else {
      return Promise.cast(Idea.update({_id: idea._id, 'ratings.rater': {$nin : [rating.name]}}, {$push : {ratings : rating}}).exec());
    }
}); 

因此,它将搜索John的评分是否已经存在,并相应地执行$push$set