@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í.