@Jason Cust hat es schon ziemlich gut erklärt - in dieser Situation ist es oft die beste Lösung, das Schema zu ändern, um zu verhindern, dass Users
abgefragt werden nach Eigenschaften von Dokumenten, die in einer separaten Sammlung gespeichert sind.
Hier ist die beste Lösung, die mir einfällt, die Sie jedoch nicht dazu zwingt (weil Sie in dem Kommentar gesagt haben, dass Sie das nicht können).
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
});
});
Wir füllen hier nur email
aus s übereinstimmende Zusatzabfrage (match
Option in .populate()
anrufen) - ansonsten email
Feld in Users
Dokumente werden auf null
gesetzt .
Alles, was übrig bleibt, ist .filter
auf zurückgegebene users
array, wie in Ihrer ursprünglichen Frage - nur mit viel einfacherer, sehr allgemeiner Prüfung. Wie Sie sehen können - entweder die email
vorhanden ist oder nicht.