source

Mongoose, CastError: 모델이 포함된 모델을 저장하려고 할 때 값에 대해 배열로 캐스트하지 못했습니다.

ittop 2023. 5. 2. 22:55
반응형

Mongoose, CastError: 모델이 포함된 모델을 저장하려고 할 때 값에 대해 배열로 캐스트하지 못했습니다.

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

저축class1정상적으로 작동하는 것 같지만 mongodb를 확인하면 다음과 같이 표시됩니다.

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

뭐가"__v : 0"?

사용자를 저장하지 못했습니다. 다음 오류가 발생했습니다.

ValidationError: CastError: 경로 "classes"에서 "{marks: [72, 88, 63], 등급: [30, 40, 30], _id: someId, className: 'TEST1234' }" 값에 대해 어레이에 캐스트가 실패했습니다.

그 오류는 정확히 무엇을 의미합니까?왜 배열에 무언가를 던지는 거지?해선 안된다classes: [Class]활자의 배열이 나다class?

이런 스키마를 만들 때도 비슷한 문제가 있었습니다.

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

제 실수는 필드 이름으로 "type"을 사용하고 있고 이것은 mongoose의 예약 단어입니다.

나는 그냥 변합니다.

type: String,

로.

formType: String,

그리고 그것이 효과가 있습니다.

참조: https://github.com/Automattic/mongoose/issues/1760

type이라는 속성에 형식 규칙을 명시적으로 정의하는 것은 허용되며 오류를 발생시키지 않습니다.다음과 같이:

type: {type: String}

클래스 정의를 다음으로 변경해 보십시오.

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가 개체를 구문 분석할 수 없으므로 이 작업이 필요합니다.이제 내부 클래스 개체에 대한 새 스키마를 만들고 주 사용자에서 참조할 때 스키마 몽구스가 개체를 구문 분석할 수 있어야 합니다.

모델 정의가 잘못되었으므로 아래와 같이 수정해야 합니다.

// 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'인 개체가 있으면 mongoose는 이 개체를 형식 선언으로 해석합니다.

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

업데이트 전용

이제 Mongoose는 배열을 중첩하는 문서화된 방법인 하위 문서를 지원합니다.

var arraySchema = new Schema({
    property: String
});

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

원천

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

mongoose 5.7.0+를 사용하여 이중 중첩 스키마를 사용하여 유사한 문제가 발생했습니다.

키워드와 관련이 없다는 것만 빼면요.type몽구스 유효성 검사 버그입니다.

https://github.com/Automattic/mongoose/issues/8472

임시 해결 방법:사용하다Schema.Types.Mixed하위 계획을 위하여.

언급URL : https://stackoverflow.com/questions/33383207/mongoose-casterror-cast-to-array-failed-for-value-when-trying-to-save-a-model

반응형