Estos son mis modelos de operador:
const operatorSchema = new Schema({ operatorName: { type: String }, users:[{ email:String, payment:Number, paymentsData: Date, product: String, }], });Necesito filtrar por operatorName y correo electrónico en el bloque de usuarios. Pero cuando intento con esto, obtengo todos los usuarios en OperatorName relacionado, ¿cómo puedo consultar correctamente?
Operators.find( { $and: [{operatorName: operatorName}, {'users.email': 'super@m.com'}]}, function (err, docs) { ) { if (err) console.log(err) else { docs.forEach(function(data){ console.log(data) }) // res.render('total_earns_operator_tables', { operators: docs }); } });EDITAR
También intento con un método agregado como este, pero nuevamente, obtengo el mismo resultado y integro todos los datos del usuario, pero solo quiero demouser@mail.com
Operators.aggregate([ { $match: {$and: [{ operatorName: operatorName},{'users.email': 'demouser@mail.com' }]}}, ] ,function (err, docs) { // console.log(Operators) // Operators.find( { $and: [{operatorName: operatorName}, {users: {$elemMatch: {email:['super@m.com']}}}]}, function (err, docs) { // Operators.find( {operatorName: operatorName, "users.email": "demouser@mail.com"}, function (err, docs) { if (err) console.log(err) else { docs.forEach(function(data){ console.log(data) }) // res.render('total_earns_operator_tables', { operators: docs }); } });Es muy básico pero no pude encontrar la solución.
Su consulta está haciendo exactamente lo que se supone que debe hacer. Está devolviendo todos los documentos que satisfacen dos criterios: 1. tener un nombre de operatorName especificado y 2. una matriz de usuarios que tenga al menos un usuario que coincida con el correo electrónico especificado.
Si desea remodelar sus documentos filtrando la matriz de usuarios para incluir solo al usuario que coincida con su condición, deberá usar una agregación.
EDITAR
Según su edición: su agregación solo tiene una etapa $match , que es idéntica a su consulta anterior. Para cambiar la forma de un documento, el marco de agregación le proporciona la etapa $project , vea el ejemplo a continuación:
Operators.aggregate([ { $match: { operatorName: operatorName, "users.email": "demouser@mail.com" } }, { $project: { operatorName: '$operatorName', users: { $filter: { input: "$users", as: "user", cond: { $eq: [ "$$user.email", "demouser@mail.com" ] } } } } } ] Aquí, primero filtramos la colección para obtener solo los documentos que desea, usando la etapa $match , luego usamos el operador $filter en la etapa $project , para devolver solo los usuarios coincidentes dentro de la matriz.
Ver el patio de trabajo