@Jason Cust l'ho già spiegato abbastanza bene - in questa situazione spesso la soluzione migliore è modificare lo schema per evitare di interrogare Users
per proprietà dei documenti conservati in raccolta differenziata.
Ecco la soluzione migliore che mi viene in mente che non ti costringerà a farlo, però (perché nel commento hai detto che non puoi).
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
});
});
Quello che stiamo facendo qui è compilare solo email
s corrispondente a una query aggiuntiva (match
opzione in .populate()
chiama) - altrimenti email
campo in Users
i documenti verranno impostati su null
.
Tutto ciò che resta è .filter
sugli users
restituiti array, come nella tua domanda originale, solo con un controllo molto più semplice e molto generico. Come puoi vedere, l'email
c'è o non c'è.