Meteor:为集合服务器端创建筛选器,并将其存储在本地集合中.好主意

Meteor: Create filters for a collection server side and store them in a local collection. Good idea?

本文关键字:集合 存储 好主意 服务器端 创建 筛选 Meteor      更新时间:2023-09-26

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

{标签: ['foo'], 用户: 'Ken'}{标签: ['酒吧', '巴兹'], 用户: '芭比'}

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

var Filters = new Meteor.Collection(空)

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

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

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

谢谢!

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

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