我有一个动态数据模型,有几个静态字段,其余是动态的。 e.g。
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存储了动态字段,但在'find'这些字段返回为blob而toJSON()/ toObject()将其删除。有没有办法将它们转换回子文档?
答案 0 :(得分:1)
根据我的经验,Mongoose不会保存模式中未定义的内容。根据您的itemSchema
,title
或price
以外的任何内容都不会被保存。
根据您提供的代码,我假设颜色,大小和材料可能存在或不存在但如果存在,则它们都遵循相同的格式:具有selected
和{的对象{1}}键。所以你可能想尝试Mongoose Subdocuments
options
请注意,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
});
,color
和material
键不是必需的,这仍然允许它们是动态的。如果存在数据,则将保存密钥+数据。如果没有数据,则它们的密钥也不会被保存。
<强>更新强>
正如您在评论中提到的,您并不了解所有动态属性。在这种情况下,如果您在架构上将属性指定为“空白”对象,则Mongoose将允许该空白对象上的任何和所有属性,如下所示:
size
此处,var itemSchema = mongoose.Schema({
title: {type:String, required:true},
price: {type:Number, required:true},
selection:{}
});
密钥 - 作为“空白”对象 - 可以包含selection
,size
,color
或任何其他密钥。它们不需要事先知道。您仍然可以使用selectionSchema来强制执行密钥和操作。该子对象的值。
答案 1 :(得分:0)
我认为你应该在架构声明中使用strict选项设置为false,以便保存添加到文档中的其他属性:
在这里,更多信息: http://mongoosejs.com/docs/guide.html#strict
问候!