@Jason Cust вече го обясни доста добре - в тази ситуация често най-доброто решение е да промените схемата, за да предотвратите заявки Users по свойства на документи, съхранявани в отделна колекция.
Ето най-доброто решение, за което се сещам, което обаче няма да ви принуди да го направите (защото казахте в коментара, че не можете).
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
});
});
Това, което правим тук, е да попълваме само email s съответстваща допълнителна заявка (match опция в .populate() обаждане) - в противен случай email поле в Users документи ще бъдат зададени на null .
Всичко, което остава, е .filter на върнатите users масив, както в първоначалния ви въпрос - само с много по-проста, много обща проверка. Както можете да видите - или email има ли го или го няма.