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?
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.
Vous pouvez également utiliser ce que vous aviez, mettez-le simplement entre guillemets:
Meteor.users.find({ "emails.address" : '[email protected]' });
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 .
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()
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")
}
}
}
});
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]');
}