使用对象字段的猫鼬保存模型

时间:2018-01-17 21:33:43

标签: node.js mongoose

我试图保存一个带有对象字段架构的猫鼬模型。当我尝试保存时,我收到以下错误。我错过了什么?

我怀疑这可能与猫鼬对象不太像标准javascript对象有关,因为它们被改变了。然而,令我感到困惑的是,我在我的代码的另一部分中使用具有嵌套对象字段且可行的模式执行完全相同的操作。

我尝试过的事情:

  • 为了测试,我改变了我的模式,将结果类型和结果列表作为单独的字段列出而没有嵌套,当我这样做时,它有效。
  • 我还尝试在我的模型之外创建一个具有键值对的对象,然后将该对象传递给我的模型。那也行不通。

模式

 var ResultSchema = new mongoose.Schema({
    event_id : mongoose.Schema.ObjectId,
    event_name: String,
    event_type: String,
    resultdate : String,
    resulttype: {
        type: String, 
        round: Number
    },
    // resulttype: String,
    // resultround: Number,
 });

模型保存:

var newResult = new ResultModel({
    // objNewResult
    event_id: req.body.eventid,//hidden field
    event_name: req.body.eventname, //hidden field
    resultdate: req.body.resultdate,
    // resulttype: resulttypelist,
    // resultround: resultroundlist,
    resulttype: {
        type: req.body.resulttypelist, 
        round: req.body.resultroundlist
    }
});

newResult.save(function (err, result) {
        if (err) {
            console.log("SOMETHING WENT WRONG");
            console.log(err);
        } else {
            console.log("SUCCESSFUL RESULT ADDITION");
        }
    });

错误:

ValidationError: results validation failed: resulttype: Cast to String failed for value "{ type: 'standard', round: '1' }" at path "resulttype"

2 个答案:

答案 0 :(得分:2)

type是Mongoose模式中的保留关键字。它用于指定字段的类型。当您指定:

resulttype: {
    type: String, 
    round: String
},

Mongoose会将字段resulttype视为字符串。所以你必须使用另一个名字而不是类型。

答案 1 :(得分:1)

type是保留密钥:

  

默认情况下,如果您有一个带键的对象'键入'在你的模式中,mongoose会将其解释为类型声明。 Source

现在,resulttype应该是String类型。您可以改用另一个键:

模式的:

resulttype: {
  resultType: String, 
  round: String
},

模特保存:

var newResult = new ResultModel({
  // ...

  resulttype: {
    resultType: req.body.resulttypelist, 
    round: parseFloat(req.body.resultroundlist),
  }
});