Encuentre documentos que contengan cierto campo para el subobjeto MongoDb y Node.js

Tengo una colección con el siguiente formato:

[ { firstname: 'Joe', lastname: 'Blow', emails: [ { email: '[email protected]', valid: false }, { email: '[email protected]', valid: false } ], password: 'abc123', _id: 57017e173915101e0ad5d94a }, { firstname: 'Johnny', lastname: 'Doe', emails: [ { email: '[email protected]', valid: false } ], password: 'abc123', _id: 57017e173915101e0ad5d87b }, ] 

Estoy tratando de encontrar un usuario basado en el campo emails.email . Aquí está lo que tengo hasta ahora:

 db.collection('users').aggregate([ {$unwind: "$emails"}, {$group: {_id: "$_id",user_emails: { $push: "$emails.email" } } }, {$match: {'user_emails': { $in: ['[email protected]'] } } } ], (error, result) => { console.log(error); console.log(result); } ); 

Cuando ejecuto este comando en el shell mongo parece funcionar; sin embargo, cuando lo ejecuto en Node.js se imprime null para el error y [] para el resultado.

¿Qué estoy haciendo mal? Soy bastante nuevo en MongoDB y parece que no puedo resolver esto.

¿Por qué quieres desconectar todos los correos electrónicos? Esa será una operación muy costosa cuando su colección crezca con toneladas de registros.

La siguiente consulta devolverá al usuario con el correo electrónico [email protected]. Creo que eso es lo que estás buscando, ¿verdad?

 db.email.find({emails :{$elemMatch:{email:"[email protected]"}}}) 

He reescrito tu código con ligeros cambios.

 var col = db.collection('collection'); if (col) { col.aggregate([ {$unwind: "$emails"}, {$group: {_id: "$_id",user_emails: { $push: "$emails.email" } } }, {$match: {'user_emails': { $in: ['[email protected]example.com'] } } } ], function(e, r){ if(e){ console.log(error); } console.log(r); db.close(); }); } 

Debería funcionar, siempre que haya establecido la conexión y otros requisitos con éxito. Proporcionados sus documentos de muestra, se emitirá:

 [ { _id: '57017e173915101e0ad5d94a', user_emails: [ '[email protected]', '[email protected]' ] } ]