web-dev-qa-db-fra.com

meteor.js: rechercher des utilisateurs par e-mail

Dans mon application meteor.js, j'essaie d'écrire une simple page d'administration qui peut trouver un utilisateur par son adresse e-mail.

Je peux voir que dans la collection Meteor.users il y a un tableau d'e-mails, qui a des objets comme ça

{ address : '[email protected]',
  verified : false
}

Normalement, dans Mongodb, je peux rechercher dans ce tableau d'e-mails comme suit:

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

Mais cette requête génère une erreur:

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

Aka Meteor n'aime pas la requête imbriquée ...

Des idées sur la façon d'interroger la collection Meteor.users par adresse e-mail?

20
Petrov

S'il est sur le serveur, Meteor a une fonction spéciale pour cela: Accounts.findUserByEmail (email) .

Je crois que c'est la voie recommandée.

27

Vous pouvez également utiliser ce que vous aviez, mettez-le simplement entre guillemets:

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

Les e-mails contiennent un éventail d'e-mails. Chaque email a une adresse.

Essayez { emails: { $elemMatch: { address: "[email protected]" } } }.

Des informations sur $elemMatch est ici .

Les informations sur les e-mails sous forme de tableau sont ici .

18
user728291

Par défaut, Meteor ne publie que l'utilisateur connecté et vous pouvez, comme vous le mentionnez, exécuter des requêtes sur cet utilisateur. Pour accéder aux autres utilisateurs, vous devez les publier sur le serveur:

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

Et abonnez-vous sur le client:

Meteor.subscribe('allUsers');

Et exécutez la commande suivante

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

OR

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

Référez-vous ceci

3
Jagdish Barabari

Si vous souhaitez rechercher tous les e-mails dans le tableau Comptes et effectuer une requête insensible:

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

Une solution de contournement possible, si cela fonctionne sur le serveur mais pas sur le client, consiste à utiliser un users_by_email méthode sur le serveur:

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]');
}
2
Christian Ternus