2012-10-27 19 views
26

Sto iniziando con mongodb e ho difficoltà a cercare di interrogare i documenti nidificati. Ho due schemi:Interrogare i documenti nidificati usando Mongoose (MongoDB)

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

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

Come potete vedere, mi sto solo legando per costruire un semplice strumento di bookmarking. Ogni utente ha un nome e una collezione di link. Ogni link ha un nome e un URL.

Ora, quello che sto cercando di fare è, ad esempio, vedere se esiste già un link nell'array di collegamenti di qualcuno. Vorrei essere in grado di fare qualcosa di simile (Cercando di ottenere raccolta di link di Vlad e poi vedere se il link interrogazione già appartiene alla collezione o meno):

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!"); 
     } 
    }); 
    }); 
}); 

Naturalmente, questo codice non funziona , perché apparentemente non posso fare un "user.links.find()". Immagino di poter semplicemente fare un user.links.map per estrarre solo url e quindi eseguire una query di appartenenza contro di essa. Ma penso che questo sarebbe lontano dalla soluzione giusta. Deve esserci un modo per fare qualcosa di simile in questo modo usando le query DB. Qualcuno può aiutare? Grazie!

risposta

52

è possibile interrogare un documento incorporato in mangusta come questo

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

e di trovare i link che appartengono all'utente "vlad", è possibile scrivere

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

Questo farà il trucco .

+3

perché il parametro restituito è 'foundLinks' e non' foundUsers'? – geevee

+0

Puoi rispondere al commento di @geevee? –

+1

@ RémiBecheras @geevee Dovrebbe essere 'foundUsers', ma ho appena usato il codice che l'OP aveva originariamente postato .. era' foundLinks' lì .. puoi verificarlo :) – RameshVel

Problemi correlati