2012-04-02 5 views
5

J'ai lu et relu plusieurs articles sur les documents incorporés et liés dans Mongoose. Sur la base de ce que j'ai lu, je l'ai conclu qu'il serait préférable d'avoir une structure de schéma similaire à ce qui suit:Comment remplir des documents incorporés Mongoose imbriqués

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

Les données définies dans CategoriesSchema, ColorsSchema et MaterialsSchema ne changera pas très souvent, voire jamais. J'ai décidé qu'il serait préférable d'avoir toutes les données dans le modèle Catalogue, car s'il y a plusieurs catégories, couleurs et matériaux, il n'y en aura pas beaucoup et je n'ai pas besoin de les trouver indépendamment du catalogue.

Mais je suis totalement confus au sujet de la sauvegarde des données dans le modèle. Voilà où je suis déconcerté:

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

}); 

Avec un schéma intégré imbriqué comme celui-ci, comment j'obtenir des données dans les matériaux et les couleurs des documents intégrés?

La méthode .push() ne semble pas être disponible pour les documents imbriqués.

Répondre

7

Le tableau de documents incorporés possède la méthode push. Ajoutez simplement Embarqués documents après avoir créé d'abord le 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}); 

alors vous pouvez pousser chaque doc intégré dans leurs parents:

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

Vous pouvez ensuite enregistrer l'ensemble de l'objet de la base de données que vous où faire déjà:

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

C'est tout! Et vous avez Embedded DocumentArrays.

Quelques autres notes sur votre code, vous avez deux fois pattern dans votre modèle de catalogue. Et pour accéder à vos autres types de modèles, vous devrez également les exporter:

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

S'il y a beaucoup de catalogue dans la collection. comment allons-nous pousser à l'identification particulière ?? –

Questions connexes