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