Nach dem Auffüllen Mungo
Ich habe einige Schwierigkeiten Abfragen eines Dokuments durch die passenden Werte innerhalb des Dokuments, nachdem sich die Bevölkerung von mongoose.
Meine Schemata sind so etwas wie dieses:
var EmailSchema = new mongoose.Schema({
type: String
});
var UserSchema = new mongoose.Schema({
name: String,
email: [{type:Schema.Types.ObjectId, ref:'Email'}]
});
Ich würde gerne haben, alle Benutzer die eine E-Mail mit dem type = "Gmail" zum Beispiel.
Folgende Abfrage liefert leere Ergebnisse:
Users.find({'email.type':'Gmail').populate('email').exec( function(err, users)
{
res.json(users);
});
Musste ich das resort, um die Ergebnisse filtern, die in JS so:
users = users.filter(function(user)
{
for (var index = 0; index < user.email.length; index++) {
var email = user.email[index];
if(email.type === "Gmail")
{
return true;
}
}
return false;
});
Gibt es irgendeine Möglichkeit, abzufragen, so etwas wie dieses gerade von mongoose?
Du musst angemeldet sein, um einen Kommentar abzugeben.
@Jason Cust erklärt es Recht gut schon - in dieser situation oft die beste Lösung ist, um zu verändern das schema, zu verhindern, dass Abfragen
Users
von Eigenschaften der gespeicherten Dokumente in die getrennte Sammlung.Ist hier die beste Lösung, die ich mir denken kann, dass wird Sie nicht zwingen, das zu tun, obwohl (weil Sie gesagt haben, im Kommentar, dass Sie nicht können).
Was wir hier tun, ist das Auffüllen nur
email
s passende zusätzliche Abfrage (match
option in.populate()
call) - sonstemail
Feld inUsers
Dokumente werden aufnull
.Alles, was übrig ist
.filter
auf zurückgegebenusers
array, wie in deiner ursprünglichen Frage - nur mit sehr viel einfachere, sehr generische überprüfen. Wie Sie sehen können - entweder in deremail
ist es oder es ist es nicht.users
ist eine große Sammlung mit diesem Ansatz._id
s richtig gefilterten e-mails (Emails.find()
), 2: Laden Sie nur Benutzer mit e-mails, die mit denen (Users.find()
mit$in
Betreiber). Ich kann nach Beispiel dieser Lösung zu, wenn Sie interessiert sind. Auf der einen Seite nicht laden aller Benutzer Dokumente. Auf der anderen Seite scheint es noch mehr hack-ish/Abhilfe-ish.Mungo ' s
füllen
Funktion nicht ausgeführt werden soll, direkt in Mongo. Statt nach der erstenfind
- Abfrage einer Menge von Dokumenten,populate
erstellt ein array von einzelnenfind
Abfragen auf die verwiesen wird, die Sammlung zu führen und führen dann die Ergebnisse wieder in die original-Dokumente. Also im Grundefind
Abfrage versucht, eine Eigenschaft des referenzierten Dokuments (der noch nicht abgerufen wurde, noch, und daher istundefined
) zum filtern der ursprünglichen ResultSet.In diesem Fall verwenden, es scheint besser geeignet, um E-Mails zu speichern als ein Filialdokument array anstatt einer getrennten Sammlung zu erreichen, was Sie wollen zu tun. Auch, als ein Allgemeines Dokument Shop-design pattern dies ist einer der Anwendungsfälle, die Sinn macht zu speichern, ein array als Filialdokument: geringe Größe und sehr wenige änderungen.
Aktualisierung Ihrer schema:
Dann sollten Sie die folgende Abfrage funktioniert:
join
in MongoDB so MongooseJS nicht in der Lage sein, mehr zu tun als das, was es im Moment zu tun in diesem Fall. Ich denke, ein Anliegen mit dem Versuch, die Abfrage der Sammlung dieser Art ist, dass, wenn es eine große Sammlung der Bevölkerung wäre eine teure operation zu tun. Wenn dies ist, wie das schema muss ich Aussehen würde, in einem stream und filtern zu vermeiden, dass ein Engpass in der Bevölkerung.