2013-10-30 1 views
19

私のmeteor.jsアプリでは、自分のメールアドレスでユーザーを見つけることができる簡単な管理ページを作成しようとしています。meteor.js:メールでユーザーを見つける

私はMeteor.usersコレクションでそう

のMongoDBにおける通常
{ address : '[email protected]', 
    verified : false 
} 

私はそうのようなこの「電子メール」のアレイ内検索できるようなオブジェクトがある「電子メール」配列、そこにあることがわかります

Meteor.users.find({ emails.address : '[email protected]' }); 

しかし、このクエリはエラーを投げている:

While building the application: 
client/admin.js:224:41: Unexpected token . 

アカ流星がneが好きではありません。ステッドクエリー...

Meteor.usersコレクションに電子メールアドレスを照会する方法はありますか?

答えて

25

サーバ上にある場合、Meteorには特別な機能があります: Accounts.findUserByEmail(email)

私はこれが推奨される方法だと考えています。

18

電子メールには一連の電子メールが格納されています。各電子メールにはアドレスがあります。

お試し{ emails: { $elemMatch: { address: "[email protected]" } } }

$elemMatchの情報はhereです。

電子メールの配列情報はhereです。

+3

感謝!これは完全に機能しました。 docsが$ elemMatchがクライアント上で利用できないことを明示的に言うと奇妙な... – Petrov

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', '[email protected]'); 
} 
+0

電子メールオブジェクトを引用符で囲むことを忘れないでください。 – Liko

53

また、あなたは持っていたものを使用することができ、ちょうど引用符でそれを置きます:

Meteor.users.find({ "emails.address" : '[email protected]' }); 
+5

1人のユーザを探しているので、 'Meteor.users.findOne'を使うことができます。 – cutemachine

+0

Meteorの 'Accounts.findUserByEmail(email)'は、提供された電子メールアドレスに一致する複数の電子メールがある場合に注意することを指摘しておく価値があるかもしれません。 重大なデータベースの奇形以外の可能性はわかりますが、Meteorはそれを見ても十分なユースケースだと思っているようです。 https://docs.meteor.com/api/passwords.html#Accounts-findUserByEmail –

3

デフォルトでは、Meteorはログインしているユーザーのみを公開し、言及したとおり、そのユーザーに対してクエリを実行できます。

Meteor.publish("allUsers", function() { 
    return Meteor.users.find({}); 
}); 

そして、クライアント上でそれらを購読する:

Meteor.subscribe('allUsers'); 

して、次のコマンド

Meteor.users.find({"emails": "[email protected]"}).fetch() 

を実行するサーバー上に公開している他のユーザーにアクセスするためには、 OR

Meteor.users.find({"emails.0": "[email protected]"}).fetch() 

Refer this

+1

私は何が起こっているのか把握するのに非常に長い時間を費やしました。私は馬鹿なのですか、それともそれほど明確ではありませんか? –

+1

そして、わかりやすかったことをお詫びします。「Meteorはログインしたユーザーのみを公開し、あなたは「Meteor.users」という名前をつけてログインしたユーザー以上のものを返すことは本当に間違っているようです。 –

3

あなたはアカウント、アレイ内のすべてのメールを見つけ、小文字を区別しないクエリを実行する場合:

const hasUser = Meteor.users.findOne({ 
    emails: { 
     $elemMatch: { 
     address: { 
      $regex : new RegExp(doc.email, "i") 
     } 
     } 
    } 
});