2014-05-15 3 views
1

나는 두 개의 콜렉션을 가지고 있는데, 하나는 사용자 콜렉션의 _id 필드를 참조하는 user_id를 가진다.Meteor에서 조인을 수행하는 적절한 방법은 무엇입니까?

내가 한 번 모든 사용자를 쿼리 및 인덱스 배열을 밑줄 indexBy 기능과 _id에 의해, 다음 대신

뭔가이 같은 USER_ID의 테이블에 사용자 이름을 표시 할 것

:

Template.posts.users_by_id = function() { 
    _.indexBy(Users.find().fetch(), '_id'); 
} 
템플릿에서

은 :

{{ users_by_id[user_id].name }} 

그러나, users_by_id 번 테이블 대신 모든 행에 대해 호출됩니다. 내가 Template.posts.user_by_id에 가게를 _.indexBy의 결과를 시도했다 그러나 나는 또한 Uncaught ReferenceError: Users is not defined

얻을, 나는 이름 키에 액세스 할 수없는 것 만 [object Object]이 표시됩니다.

답변

0

성능을 최적화하려는 것 같지만 자동 게시를 사용하고 계십니까?

나인 경우 원하는 user_ids를 사용하여 Users 컬렉션에 가입하고 서버에서 해당 컬렉션을 다시 클라이언트에 게시하게합니다. 이러한 사용자는 로컬 메모리에 효율적으로 있으므로 Users.find (user_id) .fetch(). name을 호출하는 데는 시간이 거의 걸리지 않습니다. 또한 반응이 없으므로 컬렉션이 업데이트 될 때 인터페이스도 변경됩니다.

0

사용자를 사전에 저장하려면 사전이 필요합니다!

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; 
}; 

의견에 종속성 관리를 추가했습니다. 사전을 초기화하는 위치에 따라 필요할 수도 있고 그렇지 않을 수도 있습니다. 확실하지 않습니다. 모든 사용자 개체는했습니다 것을

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 검색이 있지만 다른 사전에는 추가 메모리가 필요하지 않으므로 채우기 및 색인 할 시간이 필요하지 않습니다. , 당신은 반응성에 문제가 생기지 않을 것입니다. 이 장소에서 최적화가 응용 프로그램에 중요 할 경우, 두 접근법을 시도하고 렌더링 시간을 비교하십시오.

0

이것은 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); 
    } 
}); 
관련 문제