javascript - Meteor:为集合服务器端创建过滤器并将它们存储在本地集合中。好主意?

标签 javascript meteor

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

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

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

var Filters = new Meteor.Collection(null)

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

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

如果您对如何在服务器上创建过滤器有任何其他想法,也值得关注。

谢谢!

最佳答案

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

但是,在我看来,更好的想法是做一些类似于穆罕默德建议的事情,并使事情正常化一点。有一个单独的 Tags 集合,其中包含标签名称和 id,并有一个 TagsUsers 连接,用于存储标签 id 和用户 id。这将使过滤变得更加容易,因为这样您只需将标签集合发布到客户端,仅添加/删除/编辑标签一次,并轻松过滤服务器上的发布方法。

// 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 上回答的。

关于javascript - Meteor:为集合服务器端创建过滤器并将它们存储在本地集合中。好主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19832455/

相关文章:

javascript - 使用 CSS 和 Javascript 实现辐射圈效果

node.js - Meteor 需要 Gulp 还是 Grunt?

javascript - 在 Meteor 应用程序中使用百度 map 与谷歌地图 API

mongodb - MongoDB 中的 .find() 具有多个条件

meteor - 在 Meteor 中,您如何检测新用户何时登录?

Meteor 包文件夹位置

javascript - Croppie 中裁剪的图像不正确

javascript - 区分日语汉字建议的 "Enter"按键和其他 "Enter"事件

javascript - ajax 回发后将项目推送到数组中

javascript - 如何在 jQuery Mobile 中等待弹出窗口关闭?