在尝试保存包含模型的模型时,Mongoose,CastError:Cast to Array的值失败.

err*_*ing 26 mongoose mongodb nosql node.js

我正在尝试使用mongoose为我的mongodb数据库创建模型.这就是我想要做的:

var Class = mongoose.model('Class', {className: String, marks: [{type: Number}], grades: [{type: Number}]});
var User = mongoose.model('User', {email: String, classes: [Class] });


//Lets create a new user
var class1 = new Class({className: 'aaa', marks: [72, 88, 63], grades: [30, 40, 30]});
var user1 = new User({email: 'aaa@some.com', classes: [class1]});
Run Code Online (Sandbox Code Playgroud)

保存class1似乎工作正常但是当我检查mongodb时,会显示:{ "_id" : ObjectId("someId"), "className" : "TEST1234", "grades" : [ 30, 40, 30 ], "marks" : [ 72, 88, 63 ], "__v" : 0 }

什么是"__v : 0"

保存用户根本不成功,这是以下错误: ValidationError: CastError: Cast to Array failed for value "{ marks: [ 72, 88, 63 ], grades: [ 30, 40, 30 ], _id: someId, className: 'TEST1234' }" at path "classes"

这个错误究竟是什么意思?为什么要向阵列投射任何东西?不应该classes: [Class]是一个类型的数组class

Vin*_*ima 86

伙计,我有类似的问题创建这样的Schema:

QuestionnaireSchema = mongoose.Schema({
    formId: Number,
    name: String,
    questions: [
        {
            type: String,
            title: String,
            alternatives:[{
                label: String,
                value: "Mixed"
            }]
        }
    ]
});
Run Code Online (Sandbox Code Playgroud)

我的错误是我使用"type"作为字段名称,这是mongoose中的保留字.

我只是改变:

            type: String,
Run Code Online (Sandbox Code Playgroud)

            formType: String,
Run Code Online (Sandbox Code Playgroud)

这很有效.

请参阅:https://github.com/Automattic/mongoose/issues/1760

  • 你知道,我感觉你刚刚把我拉了几个小时.谢谢! (5认同)
  • 你先生,值得一个饼干 (5认同)

小智 14

允许在名为type的属性上明确定义类型规则,并且不会引发错误.像这样:

type: {type: String}
Run Code Online (Sandbox Code Playgroud)

  • 这是我的首选解决方案,而不是从“类型”更改我的密钥。 (3认同)

小智 6

尝试将类定义更改为:

var classSchema = mongoose.Schema({className: String, marks: [{type: Number}], grades: [{type: Number}]});
var userSchema = mongoose.Schema({email: String, classes: [classSchema] });
var User = mongoose.model('User',userSchema);
Run Code Online (Sandbox Code Playgroud)

这是必需的,因为mongoose在没有相关模式的情况下无法解析对象.现在,当您为内部类对象创建一个新的Schema并在主userSchema中引用它时,mongoose应该能够解析您的对象.


Fur*_*ran 4

您的模型定义不正确,您应该按如下所示进行修复。

// var Schema = mongoose.Schema;
var User = mongoose.model('User',{ 
  email: String, 
  classes: [ {type: Schema.Types.ObjectID, ref: 'Class'}] 
});

var Class1 = new Class({/*yourDataWillBeHere*/})

Class1.save(function(err, classData) {
   var User1 = new User({/*YourDataWillBeHere*/})
   User1.classes.push(classData._id);
   User1.save(function(err, userData) {
      //make something with userData object 
   })
})
Run Code Online (Sandbox Code Playgroud)

populate()然后你可以像这样使用 with 获取数据

User
.find()
.populate('classes')
.exec()
Run Code Online (Sandbox Code Playgroud)