2012-04-02 24 views
5

Mongooseに埋め込まれたドキュメントとリンクされたドキュメントに関するいくつかの記事を読んだり再読み込みしました。私が読んだものに基づいて、私はそれは次のようなスキーマ構造を持っていることが最善であろうと結論している:入れ子になった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); 

CategoriesSchemaで定義されたデータを、これまでならば、ColorsSchemaとMaterialsSchemaは、非常に頻繁に変更されません。複数のカテゴリ、色、素材がありますが、それほど多くはなく、カタログとは独立したものを見つける必要はないため、Catalogモデルのすべてのデータを持つ方がよいと判断しました。

しかし、私はモデルにデータを保存することについて完全に混乱しています。ここで私は困惑します:

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

}); 

このようなネストされた埋め込みスキーマでは、どのように材料と色の埋め込みドキュメントにデータを取得するのですか?

.push()メソッドは、ネストされたドキュメントでは使用できないようです。

答えて

7

埋め込まれたドキュメントの配列にはpushメソッドがあります。単に最初に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}); 

その後、あなたは自分の両親にそれぞれ埋め込まれたドキュメントをプッシュすることができます:

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

次にあなたがオブジェクト全体にすでにやって、あなたのようにデータベースを保存することができます:

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

これだけです!そしてあなたには埋め込みドキュメント配列があります。

あなたのコードに関するその他の注意点は、カタログモデルでpatternの2倍です。また、他のモデルタイプにアクセスするには、それらをエクスポートする必要があります:

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

コレクションには多くのカタログがある場合は、我々はどのように特定のIDにプッシュしますか? –

関連する問題