如何填充嵌套的 Mongoose 嵌入文档
Posted
技术标签:
【中文标题】如何填充嵌套的 Mongoose 嵌入文档【英文标题】:How to populate nested Mongoose embedded documents 【发布时间】:2012-04-16 10:36:27 【问题描述】:我已经阅读并重新阅读了几篇关于 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 模型中会更好,因为虽然有多个类别、颜色和材料,但不会有那么多,而且我不需要独立于 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() 方法似乎不适用于嵌套文档。
【问题讨论】:
【参考方案1】:嵌入文档的数组确实有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));
就是这样!而且你有 Embedded DocumentArrays。
关于您的代码的其他一些注释,您的目录模型中有两次pattern
。为了访问您的其他模型类型,您还需要导出它们:
exports.Catalog = mongoose.model('Catalog', CatalogSchema);
exports.Color = mongoose.model('Colors', ColorsSchema);
exports.Material = mongoose.model('Materials', MaterialsSchema);
exports.Style = mongoose.model('Style', StyleSchema);
【讨论】:
如果集合中有很多目录。我们将如何推送到特定的 id??以上是关于如何填充嵌套的 Mongoose 嵌入文档的主要内容,如果未能解决你的问题,请参考以下文章
Expressjs Mongoose 发现嵌套的嵌入文档未定义
NestJS - 使用 mongoose 使用枚举嵌入嵌套文档