2012-04-02 12 views
5

Przeczytałem i ponownie przeczytałem kilka postów dotyczących wbudowanych i powiązanych dokumentów w Mongoose. W oparciu o to, co mam czytać, doszedłem do wniosku, że najlepiej byłoby mieć strukturę schematu podobnego do następującego:Jak wypełnić zagnieżdżone dokumenty wbudowane Mongoose

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

dane określone w CategoriesSchema, ColorsSchema i MaterialsSchema nie zmieniają się bardzo często, jeśli w ogóle. Zdecydowałem, że lepiej będzie mieć wszystkie dane w modelu Katalogu, ponieważ chociaż istnieje wiele kategorii, kolorów i materiałów, nie będzie ich tak wiele i nie potrzebuję znaleźć żadnego z nich niezależnie od katalogu.

Ale jestem całkowicie zdezorientowany, jeśli chodzi o zapisywanie danych w modelu. Oto, gdzie ja się zakłopotany:

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

}); 

Z zagnieżdżonego wbudowanego schematu jak to, w jaki sposób mogę otrzymać dane do materiałów i kolorów osadzone dokumenty?

Metoda .push() wydaje się niedostępna dla zagnieżdżonych dokumentów.

Odpowiedz

7

Tablica dokumentów osadzonych ma metodę push. Wystarczy dodać osadzone Dokumenty po początkowo tworząc 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}); 

wtedy można wcisnąć każdy osadzony dokument do swoich rodziców:

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

Następnie można zapisać całego obiektu bazy danych, jak ty, gdzie już robi:

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

To wszystko! I masz Embedded DocumentArrays.

Kilka innych uwag na temat twojego kodu, masz pattern dwa razy w swoim modelu katalogowym. Aby uzyskać dostęp do innych typów modeli, musisz również wyeksportować te:

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

Jeśli w kolekcji jest dużo katalogu. jak będziemy naciskać na konkretny id? –