2013-03-14 13 views
19

Mi sembra logico per me di fare qualcosa di simile al seguente:Qual è il modello corretto per gli schemi nidificati 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] 
}); 

poi in seguito. . .DO qualcosa di simile al seguente:

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

Qui si aspetterebbe la sezione utenti della domanda per essere popolato con avatar, e-mail, firstnames e lastnames. . Comunque, dal momento che gli utenti/avatar hanno già _id, questi non sono persistenti.

  • L'eliminazione di ogni _id dall'utente/avatar sembra stupida.
  • L'impostazione esplicita di ciascun utente/avatar sembra inefficiente.
  • Passando a un tipo misto, inserisce TUTTO dentro e richiede markModified.

Qual è lo schema corretto per questo tipo di schemi?

Grazie!

risposta

3

Sono mangusta niubbo ancora e se ho capito bene penso che quello che avete bisogno di leggere questo: http://mongoosejs.com/docs/populate.html

C'è un esempio molto bello e semplice, in cui è stato fatto riferimento gli schemi in altri schemi. Quindi, per includere un documento di uno schema particolare all'interno di un altro, è meglio includerlo tramite riferimento. Quando ne hai bisogno, chiami popolare sul documento principale. Quando si modifica un documento figlio, ovviamente cambierà anche il genitore popolato.

+3

Populate colpisce il database con una query aggiuntiva e non consente la selezione incompleta dei campi dall'altra raccolta. Penso che [sottodoc] (http://mongoosejs.com/docs/subdocs.html) siano più appropriati qui. – mtsr

3

Credo che tu abbia ragione nelle tue ipotesi, si chiama documenti incorporati in Mongoose, ecco l'esempio della documentazione di 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); 

Disclaimer: Non inserisco necessariamente la virgola prima degli articoli!

+0

hai bisogno di chiamare markModified ('meta') prima di salvare? – OMGPOP

+1

No, dovrebbe salvare tutti gli elementi del documento. –

Problemi correlati