我们希望用户能够查看和过滤相当多的文档。为了加快速度,我们只向客户发送有限数量的文件。但是,由于我们确实需要客户端能够过滤文档,因此我们需要一种方法来发送可以过滤的密钥和值。根据客户选择的过滤器,我们为文档创建查询。比如说我们有两个这样的文件:
{tags:['foo'],用户:'Ken'} {tags:['bar','baz'],用户:'Barbie'}
在这种情况下,客户端应该看到可以在foo,bar和baz上过滤标签,同时可以在Ken和Barbie上过滤用户。由于过滤器只是文档中数据的聚合,我不想为过滤器创建集合并将其存储在数据库中。相反,我一直在使用
var Filters = new Meteor.Collection(null)
在出版物中。我查询了我想要为其创建过滤器的所有文档,然后将过滤器插入到Filters集合中。在Filters集合上使用.observe,我会在添加过滤器时将过滤器发送到客户端。
结果是每个客户端在服务器上创建一个Filters集合。假设每个集合包含大约50-400个过滤器,如{tag:'foo',count:3}。对我而言,听起来好像没有耗尽服务器的内存,但我不是计算机科学家。对此的任何意见将不胜感激。
如果您对如何在服务器上创建过滤器有任何其他想法,那么查看它也会很有趣。
谢谢!
答案 0 :(得分:2)
如何使用field specifiers仅使用过滤器字段发布整个集合?这样就像只有过滤器的额外集合一样,在结果中你可以选择只显示不仅有tag
字段的文档。
然而,在我看来,更好的想法是做一些与穆罕默德的建议类似的事情,并对事情进行规范化。有一个单独的标签集合,其中包含标签名称和标识,并具有存储标签ID和用户标识的TagsUsers连接。这将使过滤变得更加容易,因为您可以简单地将标签集合发布到客户端,只添加/删除/编辑标签一次,并轻松过滤服务器上的发布方法。
// Server publish method
// Return just users that the client has filtered
Meteor.publish('users', function (tagIds) { // tags is an array of tag ids ['foo', 'baz']
var userIds = TagsUsers.find({ tagId: { $in: tagIds } }).map(function (connector) {
return connector.userId;
});
return Users.find({ _id: {$in: userIds } });
});
// Client subscribe method
Meteor.subscribe('users', Session.get('tag-filters'));
注意:这最初是在CodersClan
上回答的