Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Meteor:如何检查数组字段中的项目,但在发布中排除该字段?_Mongodb_Meteor_Publish Subscribe - Fatal编程技术网

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

Mongodb Meteor:如何检查数组字段中的项目,但在发布中排除该字段?,mongodb,meteor,publish-subscribe,Mongodb,Meteor,Publish Subscribe,我正试图在我的帖子集的流星发布中找出如何做到这一点: 检查sharedBy数组是否包含当前用户ID。 sharedBy是共享此帖子的所有用户的数组 如果是,请使用布尔值将Posts集合更新,即isSharedCurrentUser为1。 最好只有客户端集合才能添加此新字段 发布Posts集合,但排除sharedBy数组(因为它可能包含数百万个条目) 如果您的sharedBy数组可能有数百万个条目,我建议切换跟踪“共享”的方式。将数组SharedPostId添加到用户对象中,该对象包含用户

我正试图在我的帖子集的流星发布中找出如何做到这一点:

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

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

    为了比较数字,如果一个超级用户每天共享10个帖子,那么每年将有3650个条目。当发送到客户端时,可能不足以引起注意


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

    我有一个解决方案,来自Gadi:

    对于大型共享(即超过几千个)来说,这似乎是一个非常糟糕的主意,因为Mongo的最大文档大小为16Meg,因此我估计SharedBy阵列中有10万用户,这将导致重大性能问题。我将致力于让它与引用和嵌入方式一起工作,如下所示:

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

    }))

    我想更多地了解一下这个发布函数:它接受参数吗?它是为当前用户发布所有帖子还是只发布那些帖子?还有其他发布后功能吗?等等。你能解释一下你用数字2做什么吗?因为这似乎是一个错误的方法,如果我们想出另一种方法来实现它,会让一切变得更漂亮。我想检查一下当前登录用户是否共享了在把手{{{每个帖子}期间显示的帖子。我心目中的发布函数没有任何参数。这是一个很好的主意,可能代码也少了,但现在我是根据下面的帖子来做的,只是为了让它发挥作用。再想一想,下面的答案不太好,正如下面提到的,文档大小可能很容易超过16Meg Monogo限制。为了保持理智,我将找到一种方法,通过一个单独的集合来实现这一点,如下所示: