Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mongoose, CastError: Cast to Array failed for value when trying to save a model that contains a model

I am trying to create the model for my mongodb database using mongoose. This is what I am trying to do:

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: '[email protected]', classes: [class1]}); 

Saving class1 seems to work okay but when I check mongodb, this is displayed:

{    "_id" : ObjectId("someId"),    "className" : "TEST1234",    "grades" : [ 30, 40, 30 ],    "marks" : [ 72, 88, 63 ],    "__v" : 0  } 

What is "__v : 0"?

Saving the user is not successful at all, this is the following error:

ValidationError: CastError: Cast to Array failed for value "{ marks: [ 72, 88, 63 ], grades: [ 30, 40, 30 ], _id: someId, className: 'TEST1234' }" at path "classes" `

What exactly does the error mean? Why is it casting anything to a array? Shouldn't classes: [Class] be an array of type class?

like image 504
errorreplicating Avatar asked Oct 28 '15 04:10

errorreplicating


2 Answers

Man, I had a similar issue creating an Schema like this:

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

My mistake was that I am using "type" as a field name and this is reserved word in mongoose.

I just change:

type: String, 

to

formType: String, 

and that works.

see: https://github.com/Automattic/mongoose/issues/1760

like image 178
Vinicius Lima Avatar answered Sep 29 '22 04:09

Vinicius Lima


Explicitly defining the type rule on a property called type is allowed and won't throw an error. like this:

type: {type: String} 
like image 29
Aaron Moore Avatar answered Sep 29 '22 03:09

Aaron Moore