react - meteor.js: encuentra usuarios por email
templates meteor js (6)
En mi aplicación meteor.js, estoy tratando de escribir una página de administración simple que pueda encontrar un usuario por su dirección de correo electrónico.
Puedo ver que en la colección Meteor.users hay una matriz de ''correos electrónicos'', que tiene objetos como este
{ address : ''[email protected]'',
verified : false
}
Normalmente en Mongodb puedo buscar dentro de esta matriz de ''correos electrónicos'' de la siguiente manera:
Meteor.users.find({ emails.address : ''[email protected]'' });
Pero esta consulta está arrojando un error:
While building the application:
client/admin.js:224:41: Unexpected token .
A Aka Meteor no le gusta la consulta anidada ...
¿Alguna idea sobre cómo consultar la colección Meteor.users por dirección de correo electrónico?
De forma predeterminada, Meteor solo publica al usuario que ha iniciado sesión y usted puede, como usted menciona, ejecutar consultas contra ese usuario. Para acceder a los otros usuarios tienes que publicarlos en el servidor:
Meteor.publish("allUsers", function () {
return Meteor.users.find({});
});
Y suscríbase a ellos en el cliente:
Meteor.subscribe(''allUsers'');
Y ejecuta el siguiente comando
Meteor.users.find({"emails": "[email protected]"}).fetch()
O
Meteor.users.find({"emails.0": "[email protected]"}).fetch()
Los correos electrónicos tienen una gran variedad de correos electrónicos. Cada correo electrónico tiene una dirección.
Intente { emails: { $elemMatch: { address: "[email protected]" } } }
.
La información sobre $elemMatch
está here .
La información sobre los correos electrónicos como una matriz está here .
Si desea buscar todos los correos electrónicos dentro de la matriz de Cuentas, y hacer una consulta insensible:
const hasUser = Meteor.users.findOne({
emails: {
$elemMatch: {
address: {
$regex : new RegExp(doc.email, "i")
}
}
}
});
Si está en el servidor, Meteor tiene una función especial para esto: Accounts.findUserByEmail(email) .
Creo que esta es la forma recomendada.
También puedes usar lo que tenías, solo ponlo entre comillas:
Meteor.users.find({ "emails.address" : ''[email protected]'' });
Una posible solución, si esto funciona en el servidor pero no en el cliente, es usar un método users_by_email
en el servidor:
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]'');
}