2017-12-04 14 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

'' '' '' 'と' '' '' '' '' '' '' '' '' '' '' '' '' '' 'それは単なるグループ名の配列ですか?おそらく、あなたが示唆したような別のコレクションを持ち、オブザーバーをallUsersで実行させることができます。ユーザ文書が新たに挿入または変更または削除された場合、それに応じてオブザーバを介してカウントを増加または減少させる。 – blueren

+0

基本的には、ユーザーのグループとグループのプライベートフィールドは、グループに関連するIDの配列です。 – Evans

答えて

1

モデリングの面では、ユーザーとグループの間に多対多の関係がありますが、自身のプロパティには公開または非公開のプロパティがあります。あなたは将来、その関係の他の特性を追跡したいと想像することができます。例えば、joinedDate

の代わりにあなたが余分なプロパティが含まオブジェクトの配列を格納することができ、ユーザーのドキュメント内のgroupId文字列の配列を格納。あなたはメンバーをカウントしたい場合

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

:あなたはあなたが行うことができ、ユーザーにグループのすべての公共メンバーを公開したい場合は

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

:1つのユーザーにとって、これはのようになります。

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(); 

パフォーマンスを向上させるには、両方の配列オブジェクトキーにインデックスを付ける必要があります。

関連する問題