如何填充嵌套的 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 嵌入文档的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mongoose 填充具有无限嵌套级别的文档

Expressjs Mongoose 发现嵌套的嵌入文档未定义

NestJS - 使用 mongoose 使用枚举嵌入嵌套文档

Mongoose:填充嵌套的 id 数组

MongoDB Mongoose 聚合查询深度嵌套数组删除空结果并填充引用

构建我的猫鼬模式的最佳方式:嵌入式数组、填充、子文档?