2012-04-02 16 views
5

Ho letto e riletto diversi post sui documenti incorporati e collegati in Mongoose. Sulla base di quello che ho letto, ho concluso che sarebbe stato meglio avere struttura dello schema simile al seguente:Come compilare i documenti incorporati di Mongoose nidificati

var CategoriesSchema = new Schema({ 
    year   : {type: Number, index: true}, 
    make   : {type: String, index: true}, 
    model   : {type: String, index: true}, 
    body   : {type: String, index: true} 
}); 

var ColorsSchema = new Schema({ 
    name   : String, 
    id    : String, 
    surcharge  : Number 
}); 

var MaterialsSchema = new Schema({ 
    name    : {type: String, index: true}, 
    surcharge   : String, 
    colors    : [ColorsSchema] 
}); 

var StyleSchema = new Schema({ 
    name    : {type: String, index: true}, 
    surcharge   : String, 
    materials   : [MaterialsSchema] 
}); 

var CatalogSchema = new Schema({ 
    name     : {type: String, index: true}, 
    referenceId   : ObjectId, 
    pattern    : String, 
    categories   : [CategoriesSchema], 
    description   : String, 
    specifications  : String, 
    price    : String, 
    cost    : String, 
    pattern    : String, 
    thumbnailPath  : String, 
    primaryImagePath : String, 
    styles    : [StyleSchema] 
}); 

mongoose.connect('mongodb://127.0.0.1:27017/sc'); 
exports.Catalog = mongoose.model('Catalog', CatalogSchema); 

I dati definiti in CategoriesSchema, ColorsSchema e MaterialsSchema non cambierà molto spesso, se mai. Ho deciso che sarebbe stato meglio avere tutti i dati nel modello di catalogo perché mentre ci sono più categorie, colori e materiali, non ce ne saranno tanti e non ho bisogno di trovarli indipendenti dal catalogo.

Ma sono totalmente confuso dal salvataggio dei dati nel modello. Ecco dove vengo perplesso:

var item = new Catalog; 
item.name = "Seat 1003"; 
item.pattern = "91003"; 
item.categories.push({year: 1998, make: 'Toyota', model: 'Camry', body: 'sedan' }); 
item.styles.push({name: 'regular', surcharge: 10.00, materials(?????)}); 

item.save(function(err){ 

}); 

Con uno schema annidato incorporato in questo modo, come ho i dati sui materiali e colori documenti incorporati?

il metodo .push() non sembra essere disponibile per i documenti nidificati.

risposta

7

La serie di documenti incorporati ha il metodo push. Basta aggiungere documenti incorporati dopo aver inizialmente la creazione del item:

var item = new Catalog; 
item.name = "Seat 1003"; 
item.pattern = "91003"; 
item.categories.push({year: 1998, make: 'Toyota', model: 'Camry', body: 'sedan' }); 

var color = new Color({name: 'color regular', id: '2asdfasdfad', surcharge: 10.00}); 
var material = new Material({name: 'material regular', surcharge: 10.00}); 
var style = new Style({name: 'regular', surcharge: 10.00}); 

allora si può spingere ciascun doc integrate nelle loro genitori:

material.colors.push(color); 
style.materials.push(material); 
item.styles.push(style); 

quindi è possibile salvare l'intero oggetto del database, come si dove già facendo:

item.save(function(err){}); 

Questo è tutto! E tu hai Embedded DocumentArray.

Alcune altre note sul codice, si dispone di pattern due volte nel modello di catalogo. Per accedere agli altri tipi di modelli, è necessario esportarli anche:

exports.Catalog = mongoose.model('Catalog', CatalogSchema); 
exports.Color = mongoose.model('Colors', ColorsSchema); 
exports.Material = mongoose.model('Materials', MaterialsSchema); 
exports.Style = mongoose.model('Style', StyleSchema); 
+0

Se nella raccolta è presente molto catalogo. come spingeremo a un particolare id ?? –

Problemi correlati