【问题标题】:如何使用猫鼬将动态字段添加到现有集合
【发布时间】:2014-08-22 10:22:14
【问题描述】:

我正在尝试创建一个名为 products 的 mongodb 集合,其中我有字段(id、名称、价格和属性),现在不同的产品具有不同类型的属性,例如,与耐克鞋相比,iphone 具有不同的属性集。那么如何定义模式并使用 mongoose 动态添加新的键值对。

{
  "_id":"001",
  "name":"iphone 5",
  "price":$650,
  "properties":{
    'weight':2.3, 
    'talktime': '8 hours', 
    'battery type': 'lithium'
  }
}


{
  "_id":"002",
  "name":"nike shoes",
  "price":$80,
  "properties":{
    'size':10, 
    'color':black
  }
}

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    看看 Mongoose 的混合模式类型:http://mongoosejs.com/docs/schematypes.html。如果您为属性指定该类型 ({}),它将允许将任何内容保存到其中。

    例如:

    var ProductSchema = new Schema({
        name: String,
        price: String,
        properties: {}
    });
    mongoose.model("Product", ProductSchema);
    
    
    var Product = mongoose.model("Product");
    var product = new Product({
        "name": "iphone 5",
        "price": "$650",
        "properties": {
            "weight": 2.3,
            "talktime": "8 hours",
            "battery type": "lithium"
        }
    });
    product.save();
    

    运行上面的代码后,数据库现在包含了这个文档:

    {
        "name" : "iphone 5",
        "price" : "$650",
        "properties" : {
            "battery type" : "lithium",
            "talktime" : "8 hours",
            "weight" : 2.3
        },
        "_id" : ObjectId("53b35ca575e9d7a40de0edb7"),
        "__v" : 0
    }
    

    【讨论】:

    • 感谢您的解决方案,但如果我想嵌入子文档怎么办。例如:product.anything={id:001, name:"", desc:"", properties:{size:"9", weight:"1.4", display:"4.7"} } 是否可以在这样,我什至想从前端添加属性的键和值,这可能吗?
    • @Yash 我已经更新了答案,希望能更好地与您的问题保持一致。对于这个更新的答案,使用混合模式类型作为解决方案是否更有意义?
    • 嗨,这对我不起作用。我的模型是具有名为“rounds”的属性的锦标赛,它是空的 {} 就像您的示例一样。我设置了一个快速路由 POST 请求:tournament.rounds.roundOne = []、tournament.rounds.roundTwo = [] 等。只有当我在 Schema 中实际定义 roundOne: {}, roundTwo: {} 时它才有效,但这违背了目的
    猜你喜欢
    • 2022-10-24
    • 2012-09-24
    • 1970-01-01
    • 2021-07-17
    • 2020-11-08
    • 2023-04-07
    • 2021-09-22
    相关资源
    最近更新 更多