2017-12-04 3 views
0

사용자가 참여할 수있는 'Meteor'애플리케이션에 '그룹'이 있습니다. 그룹 페이지에는 가입 한 사용자 목록이 표시됩니다. 과 같이이 게시 임 : 또한 사용자와 같은사용자가 Meteor의 공개 또는 비공개 그룹에 가입하도록 허용 하시겠습니까?

Meteor.publish("allUsers", function() { 
    return Meteor.users.find({}, {fields: {name: 1, groups: 1}}); 
}); 

그러나 ID는 공개 또는 비공개 그룹에 가입하는 옵션이 있습니다. 내가이 일을 생각할 수있는 유일한 방법은 현재 사용자에 게시 개인적으로 합류 그룹에 대한 또 다른 필드가하는 것입니다 :

Meteor.publish('currentUser', function() { 
    return Meteor.users.find(
    { _id: this.userId }, 
    { fields: { name: 1, groups: 1, groups-private: 1 } }, 
); 
}); 

이 날 현재 사용자에게 그들이 개인적으로 가입 한 모든 그룹을 표시 할 수 있습니다 공개 그룹 데이터도 표시합니다.

그러나이 방법에는 한계가 있습니다. 그룹의 총 회원 수를 표시 할 수 없으며 모든 비공개 회원 수를 계산할 수 없습니다. 이것을 어떻게 얻을 수 있습니까? 그룹 컬렉션에 번호를 저장해야합니까? 내가 이것을하면 경쟁 조건을 얻는 것에 관심이있다.

+0

'''그룹''과''그룹 - 개인'''은 어떻게 구성되어 있습니까? 단지 그룹 이름의 배열입니까? 어쩌면 당신이 제안한 것과 같은 별도의 컬렉션을 가질 수 있고, 모든 사용자에 대해 관찰자를 실행시킬 수 있습니다. 사용자 문서가 새로 삽입되거나 변경되거나 삭제되면 관찰자를 통해 카운트를 그에 따라 증가 또는 감소시킵니다. – blueren

+0

기본적으로 사용자의 그룹 및 그룹 - 개인 필드는 그룹과 관련된 ID 배열입니다. – Evans

답변

1

모델링 측면에서 사용자와 그룹간에 다 대다 관계가 있지만 자체의 특성 인은 공개 또는 비공개가 될 수 있습니다. 하나는 미래에 그 관계의 다른 속성을 추적하고자한다고 생각할 수 있습니다 (예 : joinedDate).

대신 사용자 문서에 groupId문자열의 배열을 저장하는 당신은 개체를 추가 속성을 포함의 배열을 저장할 수 있습니다. 같은 하나의 사용자에 대해이 볼 수 있었다 : 사용자에 그룹의 모든 공공 회원을 게시 할 경우

groups = [ 
    { groupId: 1, public: true }, 
    { groupId: 2, public: false }, 
    { groupId: 3 } // or just omit the public value altogether (default is private) 
    ... 
] 

당신은 할 수 있습니다 :

Meteor.publish('publicUsersOfGroup',function(groupId){ 
    check(groupId,String); 
    if (this.userId) { 
    return Meteor.users.find({ groups: { $elemMatch: { groupId: groupId, public: true }}); 
    } 
    this.ready(); 
}); 

당신이 회원을 계산하려면

const publicCount = Meteor.users.find({ groups: { $elemMatch: { groupId: groupId, public: true }}).count(); 
const privateCount = Meteor.users.find({ groups: { $elemMatch: { groupId: groupId, public: {$ne: true }}).count(); 
const totalCount = Meteor.users.find({ groups: { $elemMatch: { groupId: groupId }).count(); 

성능을 위해서는이 두 가지 배열 객체 키를 색인화해야합니다.