流星:如何检查数组字段中的项目,但在发布中排除该字段



我正在尝试弄清楚如何在我的帖子集合的流星发布中执行此操作:

  1. 检查 sharedBy 数组是否包含当前用户 ID。
    • sharedBy 是共享此帖子的所有用户的数组。
  2. 如果是这样,请使用布尔值(即 isSharedCurrentUser)将 Posts 集合更新为 1。
    • 最好只有客户端集合才能添加此新字段。
  3. 发布 Posts 集合,但排除 sharedBy 数组(因为它可能包含数百万个条目)。

如果你的 sharedBy 数组可能有数百万个条目,我建议你切换你跟踪"共享"的方式。 将数组 sharedPostIds 添加到用户对象,其中包含用户共享的所有帖子的列表。

为了比较数字,如果一个超级用户每天分享 10 个帖子,那就是 3650 个条目/年。 发送到客户端时可能不足以注意到。

如果需要确保数据不会发送到客户端,则可以创建异步执行批量查找的 Meteor 方法。

这是我从

Gadi 工作的解决方案:https://plus.google.com/u/0/107554020054962631548/posts

对于大型 # 的共享(即超过几千个)来说,这似乎是一个非常糟糕的主意,因为 Mongo 的最大文档大小为 16Meg,所以我认为 SharedBy 数组中有 100K 用户会导致重大的性能问题。我将努力让它与引用 VS 嵌入式方式一起工作,根据这篇文章:流星,一对多关系和仅将字段添加到发布中的客户端集合?

下面有效,但由于 SharedBy 用户数量的增加,效率不高:

// includes a sharedBy: [userId1, userId2, etc...] field.
Posts = new Meteor.Collection('posts');
Meteor.publish('posts', function() {
    var self = this;
    var handle = Posts.find().observeChanges({
        added: function(id, fields) {
            fields.sharedByMe = _.contains(fields.sharedBy, self.userId);
            delete(fields.sharedBy);
            self.added('posts', id, fields);
        },
        changed: function(id, fields) {
            if (fields.sharedBy) {
                fields.sharedByMe = _.contains(fields.sharedBy, self.userId);
                delete(fields.sharedBy);
            }
            self.changed('posts', id, fields);
        },
        removed: function(id) {
            self.removed('posts', id);
        },
    });
    // Stop observing cursor when client unsubscribes
    self.onStop(function() {
            handle.stop();
    });
    self.ready();

});

最新更新