【问题标题】:Meteor: Remove collection attributes when another collection is deletedMeteor:删除另一个集合时删除集合属性
【发布时间】:2014-03-04 17:55:50
【问题描述】:

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

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

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}});
        }       
    }
});

首先,我将“类别”变量设置为与要删除的类别的名称相同。 其次,我实际上从集合中删除了类别。

最后,我设置了一个“posts”变量,等于获取包含类别名称的所有帖子,它返回一个帖子对象。我遍历帖子,并在下划线的帮助下,使用“_.without”函数返回一个不包括已删除类别的类别数组。然后我调用 Posts.update 以使用新数组更新类别。

不过,我担心的是我每次都在 For 循环中调用 Posts.update。这是一个客户端调用,所以也许这并不重要?我仍然觉得有更好的方法来做到这一点。有什么帮助吗?

【问题讨论】:

    标签: meteor


    【解决方案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});     
        }
    });
    

    注意

    这是一个客户端调用,所以也许这并不重要?

    您的断言是错误的,Posts.update 不仅仅是客户端调用。实际上,一个使用 minimongo 模拟更新操作效果的存根是在客户端执行的,同时更新也在服务器上远程执行。

    【讨论】:

    • 实际上,我收到“错误:不允许。不受信任的代码只能按 ID 更新文档。”当我使用此代码时。这是否仍然必须在 For 循环中运行,因为我必须使用帖子 ID 进行更新?
    • 啊,是的,你是对的。我忘记了 Meteor 只允许客户端代码一次更新一个文档,并且只有在给定它的 ID 时才更新。您可以做的是将代码放入 Meteor.method 中,或者按照您的建议,保留 for 循环并在每次迭代中根据其 id 更新单个帖子(但仍使用$pull)。另请参阅:stackoverflow.com/questions/15464507/…
    • 我个人会将更新操作移到 Meteor.method 中。在服务器上以及客户端上的关联方法存根中允许任意选择器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    相关资源
    最近更新 更多