실제 데이터베이스 자체에 존재하지 않는 스키마에 특성을 추가할 수 있게 해줌
따라서 이들은 데이터베이스에서 파생된 것 혹은 데이터베이스 내 여러 특성의 집합이라 할 수 있다.
first name
과 last name
이 있는 user Modle
fullName
을 데이터베이스에 저장할 필요는 없다.
하지만 fullName
이 데이터베이스에 있는 것처럼 접근할 수 있는 특성을 만들자
const mongoose = require("mongoose");
mongoose.set("strictQuery", true);
mongoose
.connect("mongodb://localhost:27017/shopApp")
.then(() => {
console.log("Connection Open!!!");
})
.catch((err) => {
console.log("ERROR!!!!!!!!!!!!!");
console.log(err);
});
const { Schema } = mongoose;
const personSchema = new Schema({ first: String, last: String });
personSchema.virtual("fullName").get(function () {
return `${this.first} ${this.last}`; // this는 사람 개인이자 작업하는 인스턴스를 참조하며 인스턴스 메서드를 추가하는 것과는 다르다
// 스키마에 fullName 혹은 get fullName이라 불리는 인스턴스 메서드를 작성할 수 있지만 차이점은 실제 특성인 것처럼 작동한다
});
const Person = mongoose.model("Person", personSchema);
## (REPL)
> node -i -e "$(< index.js)"
Welcome to Node.js v18.13.0.
Type ".help" for more information.
> Connection Open!!!
> const tammy = new Person({first:"Tammy", last:"Chow"})
undefined
> tammy
{
first: 'Tammy',
last: 'Chow',
_id: new ObjectId("63d68f13aa711a54346b7dea")
}
> tammy.fullName
'Tammy Chow'
> tammy.save()
Promise {
<pending>,
[Symbol(async_id_symbol)]: 690,
[Symbol(trigger_async_id_symbol)]: 5
}
## (mongo)
> use shopApp
switched to db shopApp
> show collections
people
products
> db.people.find().pretty()
{
"_id" : ObjectId("63d68f13aa711a54346b7dea"),
"first" : "Tammy",
"last" : "Chow",
"__v" : 0
}
fullName
은 존재하지 않는다.## (REPL)
> tammy.fullName
'Tammy Chow'
> tammy.fullName = "Tammy Xiao"
'Tammy Xiao'
> tammy.fullName
'Tammy Chow'
>
set()
이용하면 업데이트가 가능하다참조 : Virtual getter, settet
https://mongoosejs.com/docs/guide.html#virtuals