2013-03-14 9 views
19

Logiczne wydaje mi się zrobić coś jak następuje:Jaki jest właściwy wzorzec dla zagnieżdżonych schematów w Mongoose/MongoDB?

var AvatarSchema = new Mongoose.Schema({ 
    type: String, 
    url: String 
}); 

var UserSchema = new Mongoose.Schema({ 
    avatars: [AvatarSchema], 
    email: String, 
    name: String, 
    salt: String, 
    token: String 
}); 

var ThinUserSchema = new Mongoose.Schema({ 
    avatars: [AvatarSchema], 
    email: String, 
    firstname: String, 
    lastname: String, 
}); 

var QuestionSchema = new Mongoose.Schema({ 
    question: String, 
    users: [ThinUserSchema] 
}); 

Następnie później. . uruchamiać coś jak poniżej:

var question = new Question({ 
    question: 'Wut?', 
    users: users //where users is an array of instances of a user model of the UserSchema 
}); 

Tutaj spodziewałbym sekcja użytkowników w rachubę być wypełniane avatarów, e-maile, firstnames i lastnames. . .Jednak ponieważ użytkownicy/awatary mają już _id, nie są one zachowywane.

  • Usunięcie każdego _id z użytkownika/awatarów wydaje się głupie.
  • Jawnie konfigurowanie każdego użytkownika/awatara wydaje się nieefektywne.
  • Przełączenie na rodzaj mieszany, umieszcza WSZYSTKO tam i wymaga znacznika.

Jaki jest właściwy wzór dla tego rodzaju schematów?

Dzięki!

Odpowiedz

3

Jestem Mongoose Noob nadal i jeśli dobrze rozumiem, że to, co trzeba przeczytać to: http://mongoosejs.com/docs/populate.html

Jest bardzo ładny i prosty przykład, gdzie masz odwołuje schematów w innych schematów. Aby więc dołączyć dokument o konkretnym schemacie do innego, lepiej umieścić go w odnośniku. Gdy jest to potrzebne, wywołujesz zaludnienie na dokumencie nadrzędnym. Gdy zmienisz dokument podrzędny, zapełniony rodzic również się zmieni.

+3

Populate trafia do bazy danych z dodatkowym zapytaniem i nie pozwala na niepełny wybór pól z innej kolekcji. Myślę, że [subdocs] (http://mongoosejs.com/docs/subdocs.html) są bardziej odpowiednie tutaj. – mtsr

3

Wierzę, że masz rację w swoich założeniach, nazywa się to Dokumentami Wbudowanymi w Mongoose, oto przykład z dokumentacji Mongoose.

var Comments = new Schema({ 
    title  : String 
    , body  : String 
    , date  : Date 
}); 

var BlogPost = new Schema({ 
    author : ObjectId 
    , title  : String 
    , body  : String 
    , date  : Date 
    , comments : [Comments] 
    , meta  : { 
     votes : Number 
     , favs : Number 
    } 
}); 

mongoose.model('BlogPost', BlogPost); 

Nota prawna: Nie koniecznie umieść przecinek przed przedmiotami!

+0

Czy przed zapisaniem musisz wywołać markModified ("meta")? – OMGPOP

+1

Nie, powinien zapisać wszystkie elementy dokumentu. –

Powiązane problemy