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

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

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]}); 

保存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]是types的数组吗?

男人,我有一个类似的问题,创build一个这样的架构:

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

我的错误是,我使用“types”作为字段名称,这是mongoose的保留字。

我只是改变:

  type: String, 

  formType: String, 

这是有效的。

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

尝试将类定义更改为:

 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); 

这是必需的,因为mongoose不能parsing没有相关模式的对象。 现在,当你为内部类对象创build一个新的Schema并在主userSchema中引用它时,mongoose应该能够parsing你的对象。

你的模型定义不正确,你应该修改如下。

 // 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 }) }) 

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

 User .find() .populate('classes') .exec() 

在一个名为type的属性上明确定义types规则是允许的,不会抛出错误。 喜欢这个:

 type: {type: String} 

只是为了更新

现在Mongoose支持子文档,这是嵌套数组,

 var arraySchema = new Schema({ property: String }); var objectSchema = new Schema({ arrays: [arraySchema] }); 

来源

http://mongoosejs.com/docs/schematypes.html

默认情况下,如果在模式中有一个带有“type”键的对象,mongoose会将其解释为types声明。

 // Mongoose interprets this as 'loc is a String' var schema = new Schema({ loc: { type: String, coordinates: [Number] } }); 

更改typeKey:

 var schema = new Schema({ // Mongoose interpets this as 'loc is an object with 2 keys, type and coordinates' loc: { type: String, coordinates: [Number] }, // Mongoose interprets this as 'name is a String' name: { $type: String } }, { typeKey: '$type' }); // A '$type' key means this object is a type declaration 

链接: http : //mongoosejs.com/docs/guide.html#typeKey