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: 'aaa@some.com', 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
?
Man, I had a similar issue creating an Schema like this:
My mistake was that I am using "type" as a field name and this is reserved word in mongoose.
I just change:
to
and that works.
see: https://github.com/Automattic/mongoose/issues/1760
I got a similar issue using mongoose 5.7.0+ using double nested schema.
Except it wasn't related to the keyword
type
but a mongoose validation bug.https://github.com/Automattic/mongoose/issues/8472
Temporary workaround: Use
Schema.Types.Mixed
for the subschemaTry changing the class definition to :
This is required since mongoose is not able to parse the object without a related schema. Now when you create a new Schema for the internal class object and refer it in the main userSchema mongoose should be able to parse your object.
Your model definition is incorrect, you should fix like below.
Then you can get fetched data using with
populate()
like thisBy default, if you have an object with key 'type' in your schema, mongoose will interpret it as a type declaration.
Changing the typeKey:
Link: http://mongoosejs.com/docs/guide.html#typeKey
Explicitly defining the type rule on a property called type is allowed and won't throw an error. like this: