[MongoDB] Mongoose Instance & Static Method

유동균·2023년 1월 29일
0

MongoDB

목록 보기
8/12
post-thumbnail

Custom Method를 스키마에 추가

  • Mongoose가 이미 제공하는 기능 외에 추가로 모델에 기능을 정의하거나 추가하는 방법
...
const Product = mongoose.model.("Product", productSchema);
...
  • Instancs Method
    모든 각각의 인스턴스에서 사용 가능한 메서드
    ex) new Product(...).save()
  • Static Method
    Prodict 클래스나 Prodict 자체에 있는 메서드
    ex) Product.find()

Instance Method

...

// 화살표 함수가 아닌 기존의 함수 표현식 사용 , 함수의 값이 변함
// 함수의 값. 즉 인스턴스 메서드는 어떤 Product의 특정 인스턴스
// 하지만 화살표 함수를 쓰게되면 해당 값을 가질 수 없다.
productSchema.methods.greet = function () {
  console.log("Heloo World!!!");
};

...
## (REPL)

> const p = new Product({name: "bike bag", price: 10})
undefined

## Product의 인스턴스
> p
{
  name: 'bike bag',
  price: 10,
  onSale: false,
  categories: [],
  qty: { online: 0, inStore: 0 },
  _id: new ObjectId("63d678df03d68262921f38e6")
}

> p.greet()
Heloo World!!!
undefined
  • 특정 Product 찾기
...

const findProduct = async () => {
  const foundProduct = await Product.findOne({ name: "Mountain Bike" });
  foundProduct.greet();
};
findProduct();

...
> node index.js
Connection Open
Heloo World!!!
  • this.name 추가해보기
...

// this.name
productSchema.methods.greet = function () {
  console.log("Heloo World!!!");
  console.log(`-from ${this.name}`);
};

...
> node index.js
Connection Open
Heloo World!!!
-from Mountain Bike
  • onSale toggle 구현
...

// onSale toggle
productSchema.methods.toggleOnSale = function () {
  this.onSale = !this.onSale;
  return this.save();
};

const Product = mongoose.model("Product", productSchema);

const findProduct = async () => {
  const foundProduct = await Product.findOne({ name: "Mountain Bike" });
  console.log(foundProduct);
  await foundProduct.toggleOnSale();
  console.log(foundProduct);
};
findProduct();

...
> node index.js
Connection Open
{
  _id: new ObjectId("63d65f2ce54108a157c08d14"),
  name: 'Mountain Bike',
  price: 599,
  __v: 1,
  categories: [],
  onSale: true
}
{
  _id: new ObjectId("63d65f2ce54108a157c08d14"),
  name: 'Mountain Bike',
  price: 599,
  __v: 1,
  categories: [],
  onSale: false
}
  • Category 추가 하기
...

// add category
productSchema.methods.addCategory = function (newCate) {
  this.categories.push(newCate);
  return this.save;
};

const Product = mongoose.model("Product", productSchema);

const findProduct = async () => {
  const foundProduct = await Product.findOne({ name: "Mountain Bike" });
  console.log(foundProduct);
  await foundProduct.toggleOnSale();
  console.log(foundProduct);
  await foundProduct.addCategory("Outdoors");
  console.log(foundProduct);
};
findProduct();
...
> node index.js
Connection Open
{
  _id: new ObjectId("63d65f2ce54108a157c08d14"),
  name: 'Mountain Bike',
  price: 599,
  __v: 1,
  categories: [],
  onSale: false
}
{
  _id: new ObjectId("63d65f2ce54108a157c08d14"),
  name: 'Mountain Bike',
  price: 599,
  __v: 1,
  categories: [],
  onSale: true
}
{
  _id: new ObjectId("63d65f2ce54108a157c08d14"),
  name: 'Mountain Bike',
  price: 599,
  __v: 1,
  categories: [ 'Outdoors' ],
  onSale: true
}

Static Method

  • 인스턴스가 아닌 모델 자체에 적용되는 정적 메소드 추가하기
  • 개별 인스턴스에서 작동하는것이 아님
...

// Static Method
productSchema.statics.fireSale = function () {
  return this.updateMany({}, { onSale: true, price: 0 });
};

const Product = mongoose.model("Product", productSchema);

Product.fireSale().then((res) => console.log(res));
...
> node index.js
Connection Open
{
  acknowledged: true,
  modifiedCount: 1,
  upsertedId: null,
  upsertedCount: 0,
  matchedCount: 11
}
## (mongo)
> mongo
> use shopApp
> db.products.find()
....

{ "_id" : ObjectId("63d66e483152c679c86f3ef8"), "name" : "Mountain Bike", "price" : 0, "onSale" : true, "categories" : [ "Outdoors" ], "qty" : { "online" : 0, "inStore" : 0 }, "__v" : 0 }
{ "_id" : ObjectId("63d66ea2821c87ce860fe862"), "name" : "Tire Pump", "price" : 0, "onSale" : true, "categories" : [ "Cycling" ], "qty" : { "online" : 0, "inStore" : 0 }, "__v" : 0 }

...
  • Static Method를 만드는 경우는 편하고 유용한 방식으로 찾기나 업데이트 또는 제거 작업을 위함

  • 클래스나 모델 자체에 커스텀을 적용하고 메서드를 추가

  • 다시말해 fireSale은 특정한 Product와 관련있는 것이 아니고 모든 Product 즉, 전체적인 Product 모델과 관련이 있다.

  • 모델의 정적 메서드는 항목을 찾거나 업데이트하거나 생성하고 또 삭제할 수 있는 더 편하고 유용한 방식임

0개의 댓글