2012-10-27 25 views
26

Zaczynam od mongodb i mam problemy z wyszukiwaniem zagnieżdżonych dokumentów. Mam dwóch schematów:Wywoływanie zagnieżdżonych dokumentów przy użyciu Mongoose (MongoDB)

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

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

Jak widać, jestem po prostu wiązana mogła zbudować prostego narzędzia zakładki. Każdy użytkownik ma nazwę i zbiór linków. Każdy link ma nazwę i adres URL.

Teraz próbuję zrobić, to na przykład, sprawdzić, czy link już istnieje w czyjejś tablicy linków. Chciałbym być w stanie zrobić coś takiego (Próbuje łącza kolekcji Vlad, a następnie sprawdzić, czy połączenie zapytanie już należy do kolekcji lub nie):

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

Oczywiście, ten kod nie działa , ponieważ podobno nie mogę zrobić "user.links.find()". Sądzę, że mogę po prostu zrobić user.links.map, aby wyodrębnić tylko adresy URL, a następnie uruchomić zapytanie członkostwa przeciwko niemu. Ale myślę, że byłoby to dalekie od właściwego rozwiązania. Musi być sposób na zrobienie czegoś takiego natywnie za pomocą zapytań DB. Czy ktoś może pomóc? Dziękuję Ci!

Odpowiedz

52

Można zapytać osadzony dokument w mangusta jak ten

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

i znaleźć linki, które należą do użytkownika „Vlad”, można napisać

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

będzie to rade .

+3

dlaczego zwróconym parametrem jest 'foundLinks', a nie' foundUsers'? – geevee

+0

Czy możesz odpowiedzieć na komentarz @geevee? –

+1

@ RémiBecheras @geevee Powinien być 'foundUsers', ale użyłem kodu OP, który pierwotnie opublikował .. było' foundLinks' tam ... możesz to sprawdzić :) – RameshVel

Powiązane problemy