2

我们有相当多的文档集,我们希望我们的用户能够查看和过滤。为了加快速度,我们只向客户发送有限数量的文件。但是,由于我们确实需要客户端能够过滤文档,因此我们需要一种方法来发送它们可以过滤的键和值。根据客户对过滤器的选择,我们为文档创建查询。例如,假设我们有两个这样的文件:

{标签:['foo'],用户:'Ken'} {标签:['bar','baz'],用户:'芭比'}

在这种情况下,客户端应该看到标签可以在 foo、bar 和 baz 上过滤,而用户可以在 Ken 和 Barbie 上过滤。由于过滤器只是文档中数据的聚合,我不想为过滤器创建一个集合并将其存储在数据库中。相反,我一直在玩弄使用

var Filters = new Meteor.Collection(null)

出版物内。我查询要为其创建过滤器的所有文档,然后将过滤器插入到 Filters 集合中。在过滤器集合上使用 .observe 我在添加过滤器时将它们发送到客户端。

这样做的结果是每个客户端都会在服务器上创建一个 Filters 集合。假设这些集合中的每一个都包含大约 50-400 个过滤器,例如 {tag: 'foo', count: 3}。对我来说,这听起来好像在不耗尽服务器内存的情况下应该没问题,但我不是计算机科学家。对此的任何意见将不胜感激。

如果您对如何在服务器上创建过滤器有任何其他想法,也会很有趣。

谢谢!

4

1 回答 1

2

您如何使用字段说明符仅使用过滤器字段发布整个集合?这样,它就像一个仅包含过滤器的额外集合,并且在结果中您可以选择仅显示不只有tag字段的文档。

然而,在我看来,一个更好的主意是做一些类似于 mohamed 的建议的事情,并使事情正常化一点。有一个单独的包含标签名称和 ID 的标签集合,并有一个存储标签 ID 和用户 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上回答的

于 2013-11-07T11:42:56.283 回答