【问题标题】:Dynamic sub-doc using Mongoose使用 Mongoose 的动态子文档
【发布时间】:2013-03-29 16:14:19
【问题描述】:

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

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

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案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
    });
    

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

    更新:

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

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

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

    【讨论】:

    • 如果我事先知道所有动态属性,那可能会起作用。问题是,明天我可能会创建一个名为 age 的新属性。
    • {} 对我不起作用。文档仍然保存,没有此字段中的属性。
    【解决方案2】:

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

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

    问候!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-01
      • 2012-10-27
      • 2014-04-07
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 2017-02-22
      相关资源
      最近更新 更多