【问题标题】:How to do a lookup from a secondary collection in Meteor如何从 Meteor 中的辅助集合中进行查找
【发布时间】:2016-08-06 06:21:19
【问题描述】:

我正在 Meteor 中构建一个简单的聊天客户端。一条聊天消息存储在 Chats 集合中,其中包含一条消息,其中包含它来自的用户的 id 和用户的 id,以及消息,如下所示:

   {
     "_id" : "3Wo3EHYG8oPCS4TCc",
     "message" :
      {
         "from" : "oSiKCdvCHGrfnfQoT",
         "to" : "ESXbJXeWmNanz7zKq",
         "text" : "Hello"
       }
    }

用户存储在用户集合中,其中包含 id 和用户名:

    meteor:PRIMARY> db.users.find()
    { "_id" : "oSiKCdvCHGrfnfQoT", "username" : "user1" }
    { "_id" : "ESXbJXeWmNanz7zKq", "username" : "user2" }

我有一个显示类似消息的 HTML 页面

<body>
  <h1>Test</h1>
  {{> hello}}
</body>

<template name="hello">
  {{#each messages}}
    From {{message.from}} to {{message.to}}: {{message.text}}
  {{/each}}
</template>

使用以下模板助手:

Chats = new Mongo.Collection("chats");
Users = new Mongo.Collection("users");
import './main.html';

Template.hello.helpers({
  messages:function(){
    return Chats.find();
  }
})

这将创建以下输出:

   Test
   From oSiKCdvCHGrfnfQoT to ESXbJXeWmNanz7zKq: Hello

但是,在 HTML 页面中,我想查找用户的用户名,而不是显示他们的原始 ID。我知道我可以将用户名存储在 Chats 集合中,但我宁愿保持干净。当然,我也可以在模板辅助函数中进行查找,并创建一个新的数据结构,它模仿消息,但用用户名替换 ID。然而,这是一个相当笨拙的解决方案,我宁愿在 HTML 端进行查找。这可能吗?

【问题讨论】:

    标签: meteor handlebars.js


    【解决方案1】:

    这是一种您可以在所有模板中使用的方法:

    Template.registerHelper('username',function(userId){
      var user = Meteor.users.findOne(userId);
      return user && user.username;
    });
    

    然后在任何模板中,您只需执行{{username message.from}}(例如),用户名就会自动插入。

    【讨论】:

      猜你喜欢
      • 2015-12-22
      • 2015-08-27
      • 2012-09-06
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多