3

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

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() 删除它们。有没有办法将它们转换回子文档?

4

2 回答 2

1

根据我的经验,Mongoose 不会保存架构中未定义的内容。根据您的itemSchema,除titleprice不会保存的任何内容。

根据您提供的代码,我假设颜色、大小和材料可能存在也可能不存在,但如果存在,它们都遵循相同的格式:带有selectedoptions键的对象。所以你可能想试试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
});

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

更新:

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

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

在这里,selection作为“空白”对象的键可以包含sizecolormaterial或任何其他键。他们不需要事先知道。您仍然可以使用 selectionSchema 来强制执行该子对象的键和值。

于 2013-04-07T18:26:15.363 回答
0

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

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

问候!

于 2013-08-30T09:56:13.343 回答