@Jason Cust har redan förklarat det ganska bra - i den här situationen är ofta den bästa lösningen att ändra schemat för att förhindra att fråga Users genom egenskaper hos dokument som lagras i separat samling.
Här är den bästa lösningen jag kan komma på som dock inte kommer att tvinga dig att göra det (eftersom du sa i kommentaren att du inte kan).
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
});
});
Det vi gör här är att bara fylla i email s matchande ytterligare fråga (match alternativet i .populate() samtal) - annars email fältet i Users dokument kommer att ställas in på null .
Allt som återstår är .filter på returnerade users array, som i din ursprungliga fråga - bara med mycket enklare, mycket generisk kontroll. Som du kan se - antingen email finns där eller inte.