gpt4 book ai didi

node.js - 使用 Mongoose 的动态子文档

转载 作者:可可西里 更新时间:2023-11-01 09:52:49 26 4
gpt4 key购买 nike

我有一个动态数据模型,其中有几个静态字段,其余的都是动态的。例如

var item1 = {
title:'Door',
price: 30,
color:{selected:'blue', options:['blue', 'red']}, // dynamic
material:{selected:'wood', options:['iron', 'wood', 'plastic']}
}

var item2 = {
title:'T-Shirt',
price: 5,
color:{selected:'green', options:['blue', 'green']}, // dynamic
size:{selected:'XL', options:['XL', 'L']} // dynamic
}

标记为动态的字段在模式定义中是未知的,新的一次可以动态出现。我创建的架构如下所示:

var itemSchema = mongoose.Schema({
title: String,
price: Number
});

似乎 Mongoose 存储了动态字段,但在“查找”时,这些字段作为 blob 返回并且 toJSON()/toObject() 删除它们。有没有办法将它们转换回子文档?

最佳答案

根据我的经验,Mongoose 不会保存模式中未定义的内容。根据您的 itemSchematitleprice 以外的任何内容都不会被保存。

根据您提供的代码,我假设颜色、尺寸和 Material 可能存在也可能不存在,但如果存在,它们都遵循相同的格式:选中options 键。所以你可能想试试 Mongoose Subdocuments

var selectionSchema = new Schema({
selected:String,
options:Array
});

var itemSchema = mongoose.Schema({
title: {type:String, required:true},
price: {type:Number, required:true},
color: selectionSchema,
material: selectionSchema,
size: selectionSchema
});

请注意,colormaterialsize 键不是必需的,这仍然允许它们是动态的。如果存在数据,则键+数据将被保存。如果没有数据,它们的 key 也不会被保存。

更新:

正如您在评论中提到的,您并不预先了解所有动态属性。在这种情况下,如果您将架构上的属性指定为“空白”对象,Mongoose 将允许该空白对象上的任何和所有属性,如下所示:

var itemSchema = mongoose.Schema({
title: {type:String, required:true},
price: {type:Number, required:true},
selection:{}
});

这里,selection 键——作为一个“空白”对象——可以保存sizecolormaterial,或任何其他键。他们不需要提前知道。您仍然可以使用 selectionSchema 来强制执行该子对象的键和值。

关于node.js - 使用 Mongoose 的动态子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15864559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com