减少Meteor发送给浏览器的Mongo记录数量?

时间:2015-05-21 00:34:29

标签: mongodb meteor

我有一个Mongo项目(项目)集合。我有另一个与项目关联的权限集合(item_ownership),一个这样的权限存储拥有项目的用户的ID(owner_id)。我想获取用户拥有的所有项目并发布它们。 所以,从理论上讲,我想首先从" item_ownership'中选择item_id。然后可以将该集合插入到'项目的查询中。集合来过滤它。此筛选结果集将发布到浏览器:

Items = new Mongo.Collection("items");
ItemOwnership = new Mongo.Collection("item_ownership");

Meteor.publish('items_pub', function() {

        var itemOwnershipColl = ItemOwnership.find(
            {
                owner_id: Meteor.userId()
            },
            {
                fields: { item_id: 1 }
            }
        );

        // Compile list of items to return.
        var item_id_array = [];
        itemOwnershipColl.forEach(function (record) {
            item_id_array[item_id_array.length] = record.item_id;
        });

        return Items.find(
            {
                item_id: { $in: item_id_array }
            },
            {
                sort: {
                    item_order: 1
                }
            }
        );
});

这是最好的方法吗?

2 个答案:

答案 0 :(得分:2)

reywood:publish-composite package非常适合处理数据模型中的此类关系。

答案 1 :(得分:1)

如果我正确理解您的架构,看起来您的联接几乎是正确的。这是编写它的一种方法:

Meteor.publish('items_pub', function() {
  var selector = {owner_id: this.userId};
  var items = ItemOwnership.find(selector, {fields: {item_id: 1}}).fetch();
  var itemIds = _.pluck(items, '_id');
  return Items.find({_id: {$in: itemIds}});
});

它与您的代码基本相同,只有一些快捷方式更正:

  • 初次查找后您错过了fetch。没有它,你就无法访问这些文件。
  • _.pluck是一种将ID提取到数组中的简便方法。
  • 在发布中排序并非有用,除非它与limitskip结合使用。见common mistakes
  • 我假设您要在最后一次查找中搜索_id而不是item_id

还值得注意的是,使用mongodb时通常不需要这种联接集合(ItemOwnership)。更好的解决方案可能是在用户上存储项目数组,或者在项目上存储一组用户。