@Jason Cust wyjaśniłem to już całkiem dobrze - w takiej sytuacji często najlepszym rozwiązaniem jest zmiana schematu, aby zapobiec zapytaniom Users według właściwości dokumentów przechowywanych w oddzielnej kolekcji.
Oto najlepsze rozwiązanie, jakie przychodzi mi do głowy, które jednak nie zmusi Cię do tego (ponieważ powiedziałeś w komentarzu, że nie możesz).
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 tutaj robimy, to wypełnianie tylko email s pasujące do dodatkowego zapytania (match opcja w .populate() zadzwoń) - w przeciwnym razie email pole w Users dokumenty zostaną ustawione na null .
Pozostało tylko .filter na zwróconych users tablica, jak w pierwotnym pytaniu - tylko ze znacznie prostszym, bardzo ogólnym sprawdzeniem. Jak widać - albo email jest lub nie ma.