在我的meteor.js应用程序中,我正在尝试编写一个简单的管理页面,可以通过他/她的电子邮件地址找到用户。
我可以看到在Meteor.users集合中有一个'emails'数组,其中有像这样的对象
{ address : 'foo@foo.com',
verified : false
}
通常在Mongodb中我可以在这个'电子邮件'数组中搜索,如下所示:
Meteor.users.find({ emails.address : 'foo@foo.com' });
但是这个查询引发了一个错误:
While building the application:
client/admin.js:224:41: Unexpected token .
Aka Meteor不喜欢嵌套查询...
有关如何通过电子邮件地址查询Meteor.users集合的任何想法?
答案 0 :(得分:58)
您也可以使用您所拥有的内容,只需将其放在引号中:
Meteor.users.find({ "emails.address" : 'foo@foo.com' });
答案 1 :(得分:27)
如果在服务器上,Meteor有一个特殊功能: Accounts.findUserByEmail(email)。
我相信这是推荐的方式。
答案 2 :(得分:18)
电子邮件中包含一系列电子邮件。每封电子邮件都有一个地址。
尝试{ emails: { $elemMatch: { address: "foo@foo.com" } } }
。
有关$elemMatch
的信息为here。
有关电子邮件作为数组的信息是here。
答案 3 :(得分:3)
默认情况下,Meteor只发布登录用户,如您所述,您可以针对该用户运行查询。要访问其他用户,您必须在服务器上发布它们:
Meteor.publish("allUsers", function () {
return Meteor.users.find({});
});
在客户端订阅他们:
Meteor.subscribe('allUsers');
并运行以下命令
Meteor.users.find({"emails": "me@example.com"}).fetch()
OR
Meteor.users.find({"emails.0": "me@example.com"}).fetch()
答案 4 :(得分:3)
如果要在Accounts数组中查找所有电子邮件,并执行不敏感的查询:
const hasUser = Meteor.users.findOne({
emails: {
$elemMatch: {
address: {
$regex : new RegExp(doc.email, "i")
}
}
}
});
答案 5 :(得分:2)
一种可能的解决方法,如果这在服务器而不是客户端上运行,则在服务器上使用users_by_email
方法:
if (Meteor.isServer) {
Meteor.methods({
'get_users_by_email': function(email) {
return Users.find({ emails.address: email }).fetch();
}
});
}
if (Meteor.isClient) {
foo_users = Meteor.call('get_users_by_email', 'foo@bar.baz');
}