我有两个集合:一个用于帖子,一个用于类别。帖子有一个或多个类别。如果删除某个类别,我希望更新帖子集合,以便帖子包含任何不存在的类别。我有这个工作,但我不确定这是最有效的方法。
此代码是按下类别删除按钮时触发的代码。这将从集合中删除该类别,并浏览包含该类别的每个帖子并更新类别数组以排除已删除的类别。
Template.listCategories.events({
'click .delete-category': function(e){
e.preventDefault();
var category = this.name;
Categories.remove(this._id);
var posts = Posts.find({categories: category}).fetch();
for (var i=0;i<posts.length;i++){
var cats = _.without(posts[i].categories, category);
Posts.update(posts[i]._id, {$set: {categories: cats}});
}
}
});
首先,我将'category'变量设置为等于要删除的类别的名称。 其次,我实际上从集合中删除了该类别。
最后,我设置'posts'变量等于获取包含类别名称的所有帖子,该帖子返回帖子的对象。我遍历这些帖子,并且在下划线的帮助下,我使用'_.without'函数返回一个排除已删除类别的类别数组。然后我调用Posts.update来使用新数组更新类别。
但我担心的是,我每次都在For循环中调用Posts.update。这是一个客户端电话,所以也许这并不重要?我仍然觉得有更好的方法来做到这一点。有什么帮助吗?
答案 0 :(得分:1)
我认为您正在寻找$pull
运算符(docs):
$ pull运算符从现有运算符中删除值的所有实例 阵列。
有了这个,您的代码可以简化为:
Template.listCategories.events({
'click .delete-category': function(e){
e.preventDefault();
var category = this.name;
Categories.remove(this._id);
Posts.update({categories: category}, {$pull: {categories: category}}, {multi:true});
}
});
<强> NB 强>:
这是一个客户端电话,所以也许这并不重要?
您的断言错误,Posts.update
不仅仅是客户端电话。实际上,使用minimongo模拟更新操作的效果的存根在客户端上执行,而并行更新也在服务器上远程执行。