2011-11-23 3 views
7

Ho difficoltà a capire come inserire più profondità dello schema nidificato in MongoDB, tramite Mongoose e node.js.Node, Mongoose, problemi durante il salvataggio di più profondità dello schema nidificato

L'esempio riportato di seguito è un po 'forzato ma dovrebbe eventualmente spiegare il mio problema. Per quanto riguarda il motivo per cui ogni schema è definito come un modello completo ma non utilizzato nell'esempio, è solo perché nel mio problema del mondo reale sono modelli reali e utilizzabili e volevo che questo esempio fosse realistico nel caso fosse pertinente.

Quindi, ecco le definizioni dello schema di esempio nell'ordine inverso, vale a dire. più piccolo russo-doll prima:

// Define pen model 
var PenSchema = new Schema({ 
    color: String // black, blue or red 
}); 
var Pen = mongoose.model('Pen', PenSchema); 

// Define ruler model 
var RulerSchema = new Schema({ 
    units: String // inches or millimetres 
}); 
var Ruler = mongoose.model('Ruler', RulerSchema); 

// -------- 

// Define drawing tools model 
var DrawingToolsSchema = new Schema({ 
    label: String, 
    pens: [Pen] 
}); 
var DrawingTools = mongoose.model('DrawingTools', DrawingToolsSchema); 

// Define measuring tools model 
var MeasuringToolsSchema = new Schema({ 
    label: String, 
    ruler: [Ruler] 
}); 
var MeasuringTools = mongoose.model('MeasuringTools', MeasuringToolsSchema); 

// -------- 

// Define stationery box model 
// It has a label and two compartments - tools for drawing and measuring 
var StationeryBoxSchema = new Schema({ 
    label: String, 
    drawingTools: [DrawingToolsSchema], 
    measuringTools: [MeasuringToolsSchema] 
}); 
var StationeryBox = mongoose.model('StationeryBox', StationeryBoxSchema); 

Speriamo che si può dire per questo che c'è un modello principale, StationeryBox, che ha un'etichetta e contiene due scomparti per DrawingTools e MeasuringTools che sono annidati schema. A loro volta hanno le loro etichette e contengono schemi nidificati per penne e righelli. Il problema che sto avendo è inserito il nesting di secondo livello, es. penne/governanti. Pertanto, in base ai documenti di mangusta, la creazione del modello di livello superiore e il push nei primi oggetti nidificati funzionano correttamente, quindi si verificano problemi di attacco. Per esempio:

// To create my stationery box - this works 
var stationery = new StationeryBox({ label: 'My Stationery Box' }); 

// To add the nested compartments - this works 
stationery.drawingTools.push({ label: 'My Pens' }); 
stationery.measuringTools.push({ label: 'My Rulers' }); 

// But this is wrong as 'stationery.drawingTools.pens' is undefined 
stationery.drawingTools.pens.push({ color: 'red' }); 
stationery.drawingTools.pens.push({ color: 'black' }); 

E se torno un passo e cercare di inserire le penne allo stesso tempo, come gli strumenti di disegno:

// Also wrong - presumably the second level of nesting is the problem 
stationery.drawingTools.push({ 
    label: 'My Pens', 
    pens: [ // These object represent second levels of nested schema 
    { color: 'red' }, 
    { color: 'black' } 
    ] 
}); 

So che questo non è un esempio di super-realistica , ma è un esempio semplificato di un sistema reale che sto costruendo e questo era il modo più semplice per illustrarlo.

Il salvataggio effettivo avviene dopo questo ovviamente e l'ho lasciato fuori, ma devo aggiungere questi prossimi livelli nel richiamo di salvataggio forse?

Se qualcuno può dirmi dove sto sbagliando su questo o indicarmi la giusta direzione, ti comprerò una bella torta (solo torta immaginaria ho paura, a meno che tu non viva vicino a me).

risposta

9

Sei estremamente vicino, il problema è nelle tue definizioni Schema. Tutto si riduce alla differenza tra un oggetto Schema e un oggetto Model. Quando si specifica la mangusta Schema con documenti incorporati, è possibile impostare solo in altriSchema.

var DrawingToolsSchema = new Schema({ 
    label: String, 
    pens: [Pen] // uh-oh, broken! Pen is a Model. 
}); 

Tuttavia, si ha questo corretto per il primo livello di documenti incorporati definiti nel StationeryBoxSchema.

var StationeryBoxSchema = new Schema({ 
    label: String, 
    drawingTools: [DrawingToolsSchema], // yes! DrawingToolsSchema is a Schema 
    measuringTools: [MeasuringToolsSchema] // this one too. 
}); 

Questa differenza incide per tutto il vostro comportamento imprevisto in seguito.

+1

Grazie Daniel. Certo, hai pienamente ragione. Sono passati alcuni giorni da quando ho postato il problema originale e ho imparato molto in quel momento, quindi non posso davvero ricordare se provavo ad incorporare il modello e non lo schema era solo un refuso nel mio codice di esempio (in cui caso ho avuto qualcosa di sbagliato da qualche altra parte) o se avessi fatto lo stesso errore nel mio codice "mondo reale" (che è cambiato molto da allora, quindi non posso controllare;)). Ma come dici tu spiegherebbe il comportamento successivo, quindi probabilmente hai ragione! – tdous

+0

Piacere mio - ho capito che alcuni giorni sono lunghi quando si lavora a qualcosa del genere. Probabilmente la parte più ripida della curva di apprendimento del nodo è capire come eseguire il debug dei problemi che falliscono silenziosamente. –