【发布时间】:2016-02-26 08:22:33
【问题描述】:
我正在尝试为拥有accountStatus.isUserAccountActive: true 的用户发布类集合。我当前的代码发布了活跃的用户,然后发布了整个类集合。有人可以告诉我我做错了什么吗?
Meteor.publish('classList', function (group) {
if (Roles.userIsInRole(this.userId, ['is_teacher'], group)) {
return [
Meteor.users.find({roles:'is_student', "accountStatus.isUserAccountActive": true},
{fields: {
"profile.firstName": 1,
"profile.familyName": 1,
roles: 1,
"accountStatus.isUserAccountActive": 1
}
}),
classes.find({teacherUserId: this.userId},
{fields: {
"studentUserId": 1,
"class": 1
}})
];
} else {
// user not authorized. do not publish secrets
this.stop();
return;
}
});
【问题讨论】:
-
我没有看到任何明显的东西。如果没有看到一些具体的例子,很难说清楚。您能否发布已发布但未发布的文档以及发布该文档的
userId?尝试记录userId或在meteor shell会话中运行查询。 -
您好 MasterAm。感谢您的回复。我对上面代码的解释是它发布用户为
"accountStatus.isUserAccountActive": true的用户,然后发布所有类集合。类集合不取决于上面的集合。我想我需要一个 if 语句,如果"accountStatus.isUserAccountActive": true然后发布所有这些学生帐户。 -
您要发布
teacherUserId是当前用户ID 并且studentUserId属于accountStatus.isUserAccountActive状态为1的用户的类吗?如果是这样,那么您正在尝试执行所谓的join,这是 MongoDB 的一个痛点。这是不容易做到的。您可以对数据进行反规范化(然后您必须在数据更改时对其进行同步)或在客户端上手动执行连接(如果您可以找到用户并且用户的帐户处于活动状态,则显示该类),使用这样的包作为publish-composite或 MongoDB 的聚合。 -
是的,这听起来很正确。非规范化数据是什么意思。你的意思是我应该把所有东西都放在一个模式中吗?
-
不。反规范化是拥有相同数据的多个副本。数据库规范化是相反的动作——消除重复。非规范化在存储空间方面有其自身的成本,增加了复杂性和一致性,仅举几例,但它在许多情况下确实提供了一些性能提升。有多种架构模型可以生成非规范化数据,但这超出了本次讨论的范围。有很多关于meteor+mongo+joins和mongo+de-normalization的阅读材料。
标签: meteor