Meteor:删除另一个集合时删除集合属性

时间:2014-03-04 07:41:19

标签: meteor

我有两个集合:一个用于帖子,一个用于类别。帖子有一个或多个类别。如果删除某个类别,我希望更新帖子集合,以便帖子包含任何不存在的类别。我有这个工作,但我不确定这是最有效的方法。

此代码是按下类别删除按钮时触发的代码。这将从集合中删除该类别,并浏览包含该类别的每个帖子并更新类别数组以排除已删除的类别。

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。这是一个客户端电话,所以也许这并不重要?我仍然觉得有更好的方法来做到这一点。有什么帮助吗?

1 个答案:

答案 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模拟更新操作的效果的存根在客户端上执行,而并行更新也在服务器上远程执行。