... const Product = mongoose.model.("Product", productSchema); ...
- Instancs Method
모든 각각의 인스턴스에서 사용 가능한 메서드
ex)new Product(...).save()
- Static Method
Prodict
클래스나Prodict
자체에 있는 메서드
ex)Product.find()
...
// 화살표 함수가 아닌 기존의 함수 표현식 사용 , 함수의 값이 변함
// 함수의 값. 즉 인스턴스 메서드는 어떤 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
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
}
...
// 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
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 모델과 관련이 있다.
모델의 정적 메서드는 항목을 찾거나 업데이트하거나 생성하고 또 삭제할 수 있는 더 편하고 유용한 방식임