Trouver des documents contenant certains champs pour sous-objet MongoDb et Node.js

J'ai une collection avec le format suivant:

[ { 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 }, ] 

J'essaie de trouver un utilisateur basé sur le champ emails.email . Voici ce que j'ai jusqu'ici:

 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); } ); 

Quand je cours cette commande dans la coquille mongo, cela semble fonctionner; Cependant, lorsque je l'exécute dans Node.js il imprime null pour l'erreur et [] pour le résultat.

Qu'est-ce que je fais mal? Je suis assez nouveau chez MongoDB et je ne peux pas sembler comprendre cela.

Pourquoi voulez-vous dérouler tous les emails? Ce sera une opération très coûteuse lorsque votre collection se développera avec des tonnes d'enregistrements.

La requête ci-dessous renverra l'utilisateur avec l'email [email protected]. Je pense que c'est ce que vous cherchez bien?

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

J'ai réécrit votre code avec de légers changements.

 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]'] } } } ], function(e, r){ if(e){ console.log(error); } console.log(r); db.close(); }); } 

Cela devrait fonctionner, pourvu que vous ayez établi une connexion et d'autres exigences avec succès. À condition que votre échantillon de documents, il émettra:

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