2016-04-14 48 views
1

我正在Meteor中構建一個簡單的聊天客戶端。聊天消息被存儲在聊天集合,其具有包含來自其它用戶的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端進行查找。這可能嗎?

回答

1

這裏有一個方法,你可以用在你的模板都:

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

然後你可以簡單地做{{username message.from}}任何模板(例如)和用戶名將會自動插入。