这是我的架构的一部分:
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或更好的函数可以使用生成的经典更新方法来处理这个问题。
答案 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
。