@Jason Cust já expliquei muito bem - nesta situação, muitas vezes, a melhor solução é alterar o esquema para evitar a consulta de
Users por propriedades de documentos armazenados em coleção separada. Aqui está a melhor solução que posso pensar que não o forçará a fazer isso (porque você disse no comentário que não pode).
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
});
});
O que estamos fazendo aqui é preencher apenas
email s consulta adicional correspondente (match opção em .populate() call) - caso contrário email campo em Users documentos serão definidos como null . Tudo o que resta é
.filter em users retornados array, como na sua pergunta original - apenas com uma verificação muito mais simples e genérica. Como você pode ver - o email existe ou não.