[MongoDB] Mongoose Virtuals

유동균·2023년 1월 29일
0

MongoDB

목록 보기
9/12
post-thumbnail

Virtuals

  • 실제 데이터베이스 자체에 존재하지 않는 스키마에 특성을 추가할 수 있게 해줌

  • 따라서 이들은 데이터베이스에서 파생된 것 혹은 데이터베이스 내 여러 특성의 집합이라 할 수 있다.

  • first namelast 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은 존재하지 않는다.
  • 이 특성은 데이터베이스 내부에 존재하는 것이 아니고 자바스크립트의 Mongoose에서만 가능
## (REPL)
> tammy.fullName
'Tammy Chow'
> tammy.fullName = "Tammy Xiao"
'Tammy Xiao'
> tammy.fullName
'Tammy Chow'
> 

0개의 댓글