使用Mongoose的动态子文档

时间:2013-04-07 16:12:20

标签: node.js mongodb mongoose

我有一个动态数据模型,有几个静态字段,其余是动态的。 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()将其删除。有没有办法将它们转换回子文档?

2 个答案:

答案 0 :(得分:1)

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

根据您提供的代码,我假设颜色,大小和材料可能存在或不存在但如果存在,则它们都遵循相同的格式:具有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 }); colormaterial键不是必需的,这仍然允许它们是动态的。如果存在数据,则将保存密钥+数据。如果没有数据,则它们的密钥也不会被保存。

<强>更新

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

size

此处,var itemSchema = mongoose.Schema({ title: {type:String, required:true}, price: {type:Number, required:true}, selection:{} }); 密钥 - 作为“空白”对象 - 可以包含selectionsizecolor或任何其他密钥。它们不需要事先知道。您仍然可以使用selectionSchema来强制执行密钥和操作。该子对象的值。

答案 1 :(得分:0)

我认为你应该在架构声明中使用strict选项设置为false,以便保存添加到文档中的其他属性:

在这里,更多信息: http://mongoosejs.com/docs/guide.html#strict

问候!