2012-10-27 19 views
26

Ich beginne mit mongodb und habe es schwer, verschachtelte Dokumente abzufragen. Ich habe zwei Schemas:Abfrage von verschachtelten Dokumenten mit Mongoose (MongoDB)

var LinkSchema = new mongoose.Schema({ 
    url: String, 
    name: String 
}); 

var UserSchema = new mongoose.Schema({ 
    name: String, 
    links: [LinkSchema] 
}); 

Wie Sie sehen können, bin ich gerade binden, um ein einfaches Lesezeichen-Tool zu bauen. Jeder Benutzer hat einen Namen und eine Sammlung von Links. Jeder Link hat einen Namen und eine URL.

Nun, was ich versuche zu tun, ist zum Beispiel zu sehen, ob eine Verbindung bereits in jemandes Links-Array existiert. Ich möchte in der Lage sein, so etwas zu tun (Der Versuch, Vlads Link-Sammlung zu bekommen und dann sehen, ob die Abfrage Link gehört bereits zur Sammlung oder nicht):

app.get("/:query", function(req, res){ 
    User.findOne({"name":"vlad"}, function(err, user){ 
    user.links.find({"url":req.params.query}, function(err, foundLinks){ 
     if(foundLinks){ 
     res.send("link already exists!"); 
     } else { 
     res.send("link doesn't exist!"); 
     } 
    }); 
    }); 
}); 

Natürlich ist dieser Code nicht funktioniert , weil ich anscheinend kein "user.links.find()" machen kann. Ich denke, ich kann einfach eine user.links.map erstellen, um nur URLs zu extrahieren und dann eine Mitgliedschaftsabfrage dagegen auszuführen. Aber ich denke, das wäre bei weitem nicht die richtige Lösung. Es muss eine Möglichkeit geben, sowas nativ mit DB-Abfragen zu machen. Kann jemand helfen? Vielen Dank!

Antwort

52

Sie können ein eingebettetes Dokument in Mungo ähnliche

User.find({'links.url':req.params.query}, function(err, foundUsers){ 
     // --- 
    }); 

und finden Sie die Links abfragen, die für den Benutzer „vlad“ gehören, können Sie

User.find({name:'vlad','links.url':req.params.query}, function(err, foundUsers){ 
     // --- 
    }); 

schreiben Dies wird den Trick .

+3

Warum ist der zurückgegebene Parameter 'foundLinks' und nicht' foundUsers'? – geevee

+0

Können Sie den Kommentar @geevee beantworten? –

+1

@ RémiBecheras @gegevee Es sollte "FoundUsers" sein, aber ich habe nur den Code verwendet, den das OP ursprünglich gepostet hatte. Es war 'foundLinks' dort. Das kannst du überprüfen :) – RameshVel

Verwandte Themen