【问题标题】:Meteor: How to check if item in array field, but exclude that field in Publish?Meteor:如何检查数组字段中的项目,但在发布中排除该字段?
【发布时间】:2013-12-19 18:32:35
【问题描述】:

我正在尝试弄清楚如何在 Meteor Publish 中为我的帖子集合执行此操作:

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

【问题讨论】:

  • 我想进一步了解这个发布函数:它需要参数吗?它是发布所有帖子还是仅发布当前用户的帖子?还有其他发布后功能吗?等等
  • 您能否解释一下您使用数字 2 的目的,因为这似乎是错误的处理方式,如果我们想出另一种实现方式,一切都会变得更漂亮。
  • 我想检查当前登录的用户是否分享了在 Handlebars {{#each posts}} 期间显示的帖子。我想到的 Publish 函数不带任何参数。

标签: mongodb meteor publish-subscribe


【解决方案1】:

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

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

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

【讨论】:

  • 这是一个好主意,可能代码也更少,但现在我根据下面的帖子做了,只是为了让一些工作正常。
  • 再次想到下面的答案并不好,如下所述,文档大小很容易超过 16Meg Monogo 限制。为了理智,我会根据这篇文章找到一种方法来使用单独的集合:stackoverflow.com/questions/20688718/…
【解决方案2】:

这是我正在使用的一个解决方案,来自 Gadi: https://plus.google.com/u/0/107554020054962631548/posts

这对于大量的共享(即超过几千个)来说似乎是一个非常糟糕的主意,因为 Mongo 的最大文档大小为 16Meg,所以我认为 SharedBy 数组中有 100K 用户会导致严重的性能问题.根据这篇文章,我将努力让它与引用 VS 嵌入方式一起使用:Meteor, One to Many Relationship & add field only to client side collection in Publish?

以下方法可行,但由于 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();

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 2021-03-16
    相关资源
    最近更新 更多