【问题标题】:What is the proper way to perform a join in Meteor?在 Meteor 中执行连接的正确方法是什么?
【发布时间】:2014-07-04 13:49:31
【问题描述】:

我有两个集合,一个有一个 user_id,它引用用户集合的 _id 字段。

我想查询所有用户一次并使用下划线 indexBy 函数通过 _id 对数组进行索引,然后在表中显示用户名而不是 user_id

类似这样的:

Template.posts.users_by_id = function() {
    _.indexBy(Users.find().fetch(), '_id');
}

在模板中:

{{ users_by_id[user_id].name }}

但是,users_by_id 会为表中的每一行调用一次,而不是一次。我尝试将_.indexBy 的结果存储在Template.posts.user_by_id 中,但后来我得到Uncaught ReferenceError: Users is not defined

另外,我似乎无法访问名称键,只显示[object Object]

【问题讨论】:

    标签: templates meteor


    【解决方案1】:

    您似乎正在尝试优化性能...但您仍在使用自动发布?

    如果是我,我会使用您想要的 user_ids 订阅用户集合,并让服务器将该集合发布回客户端。由于这些用户有效地在本地内存中,调用 Users.find(user_id).fetch().name 应该花费很少的时间。而且它也是反应式的,所以当你的集合更新时,你的界面也会更新。

    【讨论】:

      【解决方案2】:

      如果要将用户存储在字典中,则需要字典!

      var users = {};
      // var usersDep = new Deps.Dependency();
      
      Template.posts.created = function() {
        users = _.indexBy(Users.find().fetch(), '_id');
        // usersDep.changed();
      };
      
      Template.posts.users_by_id = function() {
        // usersDep.depend();
        return users;
      };
      

      我在 cmets 中添加了依赖管理。根据您初始化字典的位置,可能需要也可能不需要,我现在不确定。

      请注意,您可以通过仅返回用户而不是整个字典来简化帮助程序:

      Template.posts.user_by_id = function() {
        return users[this.user_id];
      };
      

       


       

      鉴于您订阅的所有用户对象已经在相当有效的 Minimongo 中,我建议直接的方法:

      Template.posts.user_name = function() {
        return Users.findOne(this.user_id).name;
      };
      

      一方面你有一个 Minimongo 查找而不是普通的对象查找,但另一方面你不需要额外的内存来存储字典,你不需要时间来填充和索引它,而且你不会遇到反应性问题。如果此位置的优化对您的应用程序至关重要,请尝试这两种方法并比较它们的渲染时间。

      【讨论】:

        【解决方案3】:

        这是 Meteor 的典型连接模式。使用查询执行连接。

        <template name="users">
          {{#each users}}
            {{> user}}
          {{/each}}
        </template>
        
        <template name="user">
          {{#with user}}
            {{name}}
          {{/with}}
        </template>
        
        Template.users.helpers({
          users: function() {
            SomeCollection.find();
          }
        });
        
        Template.user.helpers({
          user: function() {
            return Users.findOne(this.user_id);
          }
        });
        

        【讨论】:

          猜你喜欢
          • 2012-10-15
          • 1970-01-01
          • 2014-05-08
          • 2015-08-08
          • 2011-03-21
          • 2020-06-28
          • 2012-02-25
          • 2017-05-20
          • 2021-09-12
          相关资源
          最近更新 更多