@Jason Cust l'a déjà assez bien expliqué - dans cette situation, la meilleure solution consiste souvent à modifier le schéma pour éviter d'interroger les Users par propriétés des documents stockés dans une collection séparée.
Voici la meilleure solution à laquelle je peux penser qui ne vous obligera pas à le faire (parce que vous avez dit dans le commentaire que vous ne pouvez pas).
Users.find().populate({
path: 'email',
match: {
type: 'Gmail'
}
}).exec(function(err, users) {
users = users.filter(function(user) {
return user.email; // return only users with email matching 'type: "Gmail"' query
});
});
Ce que nous faisons ici, c'est remplir uniquement email s correspondant à une requête supplémentaire (match option dans .populate() call) - sinon email champ dans Users les documents seront définis sur null .
Tout ce qui reste est .filter sur les users renvoyés tableau, comme dans votre question initiale - uniquement avec une vérification beaucoup plus simple et très générique. Comme vous pouvez le voir - soit le email est là ou il n'y en a pas.