2013-03-14 4 views
19

Es scheint mir logisch so etwas wie die folgenden Funktionen ausführen:Was ist das richtige Muster für verschachtelte Schemas in 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] 
}); 

Dann später. . .do etwas wie folgt aus:

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

Hier möchte ich den Benutzer Abschnitt der Frage erwarten mit Avataren, E-Mails gefüllt werden, die Vornamen und lastnames. . Da die Benutzer/Avatare jedoch bereits _id haben, werden diese nicht beibehalten.

  • Löschen jedes der _id vom Benutzer/Avatare scheint albern.
  • Explizites Einrichten jedes Benutzers/Avatars scheint ineffizient zu sein.
  • Wechseln zu einem gemischten Typ, setzt ALLES ein und erfordert markModified.

Was ist das richtige Muster für diese Arten von Schemas?

Danke!

Antwort

3

Ich bin Mungo Noob noch und wenn ich mich richtig denke, verstehe ich, was Sie lesen müssen, ist dies: http://mongoosejs.com/docs/populate.html

Es ist ein sehr schönes und einfaches Beispiel, wo Sie Schema in anderem Schema verwiesen haben. Um also ein Dokument eines bestimmten Schemas in ein anderes zu integrieren, ist es besser, es über eine Referenz einzuschließen. Wenn Sie es benötigen, rufen Sie im übergeordneten Dokument Auffüllen auf. Wenn Sie ein untergeordnetes Dokument ändern, ändert sich natürlich auch das übergeordnete Element.

+3

Populate trifft die Datenbank mit einer zusätzlichen Abfrage und es ermöglicht keine unvollständige Auswahl von Feldern aus der anderen Sammlung. Ich denke, [subdocs] (http://mongoosejs.com/docs/subdocs.html) sind hier geeigneter. – mtsr

3

Ich glaube, Sie sind in Ihren Annahmen richtig, es heißt Embedded-Dokumente in Mongoose, hier ist das Beispiel aus der Mongoose-Dokumentation.

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); 

Haftungsausschluss: Ich würde nicht unbedingt das Komma vor die Elemente setzen!

+0

müssen Sie MarkModified ('Meta') vor dem Speichern aufrufen? – OMGPOP

+1

Nein, es sollte alle Elemente des Dokuments speichern. –

Verwandte Themen