내장된 제약 조건
Schema 타입 & 속성 & 제약조건 알아보기
const productSchema = Schema({
name: {
type: String,
// 에러메시지를 커스텀화
required: [true, "상품 이름이 필요합니다."],
},
price: {
type: Number,
required: true,
},
});
type : String , type : Number 와 같이 type 을 명시하고, 해당 타입에 맞지 않는 값을 모델 생성시 부여하면 오류가 발생한다.
const productSchema = Schema({
name: {
type: String,
// 에러메시지를 커스텀화
required: [true, "상품 이름이 필요합니다."],
},
price: {
type: Number,
required: true,
},
});
const bike = new Product({name:'fast bike' , price: "hello"});
--> Number type에 String 타입을 부여하여 오류가 발생함
const productSchema = Schema({
name: {
type: String,
// 에러메시지를 커스텀화
required: [true, "상품 이름이 필요합니다."],
},
price: {
type: Number,
required: true,
},
});
const bike = new Product({name:'fast bike' , price: "hello", color:"red"});
다음과 같이 Schema에는 color가 없는데 모델 생성시 해당 정보를 입력하게 되면 오류는 발생하지 않고 무시하여 생략된다.
const productSchema = Schema({
name: {
type: String,
required: [true, "상품 이름이 필요합니다."],
},
price: {
type: Number,
required: true,
},
// onSale property 추가
onSale: {
type: Boolean,
default: false,
},
});
// Schema에 정의는 했지만 값을 넣지 않을경우 default로 설정했던 값이 들어감
...
const bike = new Product({ name: "Mountain Bike", price: 599});
onSale의 default 값을 false로 설정해놨기 때문에 모델 생성시 값을 주지 않아도 default 값으로 부여된다.
const productSchema = Schema({
name: {
type: String,
required: true,
maxlength: 20,
},
price: {
type: Number,
required: true,
min : 0,
},
onSale: {
type: Boolean,
default: false,
},
categories : [String],
qty : {
online: {
type: Number,
default: 0,
},
inStore: {
type: Number,
default: 0,
}
}
});
const bike = new Product({
name: "Tire Pump",
price: 19.5,
categories: ["Cycling"],
});
bike.save()
.then((data) => {
console.log("It Worked!!!");
console.log(data);
})
.catch((err) => {
console.log("ERROR!!!");
console.log(err);
});
> node index.js
Connection Open
It Worked!!!
{
name: 'Tire Pump',
price: 19.5,
onSale: false,
categories: [ 'Cycling' ],
qty: { online: 0, inStore: 0 },
_id: new ObjectId("63d66ea2821c87ce860fe862"),
__v: 0
}
그 이유는 Mongoose는 원래 그런 방식으로 작동을 하게 되는데, 업데이트를 하면서도 유효성검사를 계속해서 하도록 하려면 다음과 같은 속성을 true로 변경해주어야 한다.
Product.findOneAndUpdate(
{ name: "Tire Pump" },
{ price: -19.99 },
{ new: true, runValidators: true }
)
.then((data) => {
console.log("It Worked!!!");
console.log(data);
})
.catch((err) => {
console.log("ERROR!!!");
console.log(err);
});