我有一组用户定义如下:
Accounts.createUser({
username:'Simon',
email:'simon@email.com',
profile:{
firstname:'Simon',
lastname:'Surname',
location:'Home Address',
privacy: {
location:0,
emails:0 } //Location and emails are private and should not be disclosed
}
});
我的问题是如何考虑个人资料隐私设置,为其他用户发布此用户的记录。在此示例中,我已将位置和电子邮件的隐私设置为零,目的是不为此用户发布此信息。
我想使用标准方法发布它:
Meteor.publish("usersWithPublicEmails", function () {
return Meteor.users.find();
});
但我看不到以这样的方式指定选择器或字段的方法,即只发布公共信息。
我尝试添加以下格式的其他出版物:
Meteor.publish("allUsers", function () {
return Meteor.users.find( {}, {fields:{username:1}} );
});
Meteor.publish("usersWithPublicEmails", function () {
return Meteor.users.find( {"profile.privacy.emails":1}, {fields:{username:1, emails:1}} );
});
但是选择器似乎没有像我预期的那样返回电子邮件。我正在从性能的角度寻找最佳方法。
答案 0 :(得分:0)
Mongodb不是关系数据库,因此每当我想基于元数据加入或查询时,我记得我必须以不同的方式做事。在您的情况下,如果我想查询用户隐私,我会为用户隐私制作单独的集合。另外,如果我关心性能,我可能永远不会想要"所有x",我只是想要足以向用户展示,从而分页。考虑到这两个想法,您可以轻松获得所需内容:根据隐私设置和性能进行查询。
Privacy = new Mongo.Collection("privacy");
每当我们想为帐户添加隐私时:
Privacy.insert({
emails: 1,
userId: account._id,
});
然后,一次一页,每页显示10个结果,跟currentPage
进行跟踪:
Meteor.publish("usersWithPublicEmails function (currentPage) {
var results = []
var privacyResults = Privacy.find({"emails":1}, {skip: currentPage,
limit: 10});
var result;
while (privacyResults.hasNext() ) {
result = privacyResult.next();
results.append(Meteor.users.find({_id: result.userId});
}
return result;
});
我没有测试这段代码,它可能有错误,但它应该给你一般的想法。这里的缺点是您必须保持隐私和用户同步,但这些是您在不使用关系数据库时遇到的问题。
Mongodb有一种方法可以用更少的代码进行这种参考查找,但它仍然按需发生,我更喜欢自己动手做的灵活性。如果您有兴趣,请查看Database references
答案 1 :(得分:0)
那是因为您的发布功能fields
对象中有拼写错误,而不是email
您输入了emails
所以正确的功能是:
Meteor.publish("usersWithPublicEmails", function () {
return Meteor.users.find( {"profile.privacy.emails":1}, {fields:{username:1, email:1}} );
});
此外,您已经在allUsers
出版物中发布了所有用户名,因此,为了为相关的公共用户添加缺失的数据,您只需要需要这个:
Meteor.publish("usersWithPublicEmails", function () {
return Meteor.users.find( {"profile.privacy.emails":1}, {fields:{email:1}} );
});
并且Meteor会自动为您合并这些记录。
答案 2 :(得分:0)
最终的简单解决方案。我错过了路由器中的额外订阅:
Router.route('/users', {
name: 'userList',
waitOn: function(){
return Meteor.subscribe('allUsers') &&
Meteor.subscribe('usersWithPublicEmails');
},
data: function(){
return Meteor.users.find();
}
});
一个基本错误: - (