@Jason Cust už to vysvětlil docela dobře - v této situaci je často nejlepším řešením změnit schéma, aby se zabránilo dotazování Users podle vlastností dokumentů uložených v oddělené sbírce.
Zde je nejlepší řešení, které mě napadá a které vás k tomu nedonutí (protože jste v komentáři uvedl, že nemůžete).
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
});
});
To, co zde děláme, je vyplnění pouze email s odpovídající další dotaz (match možnost v .populate() volání) - jinak email pole v Users dokumenty budou nastaveny na null .
Zbývá pouze .filter na vrácených users pole, jako ve vaší původní otázce - pouze s mnohem jednodušší, velmi obecnou kontrolou. Jak vidíte - buď email je nebo není.