我的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 :(得分:1)
在建模方面,您在用户和群组之间存在多对多关系,但本身的关系具有属性,即它可以是公共的或私有的。可以想象您希望将来跟踪该关系的其他属性,例如joinedDate
。
您可以存储包含额外属性的对象数组,而不是在用户文档中存储groupId
字符串数组。对于一个用户,这可能看起来像:
groups = [
{ groupId: 1, public: true },
{ groupId: 2, public: false },
{ groupId: 3 } // or just omit the public value altogether (default is private)
...
]
如果您想将某个组的所有 public 成员发布给用户,您可以执行以下操作:
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();
对于性能,您需要索引这两个数组对象键。