スキーマにメソッドを追加してみる
インスタンスメソッド・・・
クラスから生成されたインスタンスから使えるメソッド
サンプルを見てみましょう。
//スキーマ定義
const productSchema = new mongoose.Schema({
onSale: {
type: Boolean,
default: false
},
//categoriesはStringの配列と宣言もできる
categories: [String],
});
//クラス作成
const Product = mongoose.model('Product', productSchema);
//モデルのインスタンス化
const bike = new Product({
name: 'ジャージ',
price: 2980,
categories: ['サイクリング'],
size: 'XS'
});
bike.save()
.then(data => {
console.log('成功!!!');
console.log(data);
})
.catch(err => {
console.log('エラー!!!');
console.log(err);
})
「Product」クラスから「bike」というインスタンスが生成され、
「bike.save()」のsaveがメソッドになります。つまりインスタンスメソッドです。
上記のスキーマに対して自作のインスタンスメソッドを記述してみましょう。
〜書き方〜
サンプルで商品に対し、セール中かセール中じゃないかの判別をつけるメソッドを用意します。
this・・・呼び出してくれたインスタンスへの参照
この場合のthisは「foundProduct」
//インスタンスメソッド
//セール中かどうか切り替えるメソッド
productSchema.methods.toggleOnSale = function () {
this.onSale = !this.onSale;
return this.save();
}
「toggleOnSale()」は非同期処理になるので、「async・await」を一緒に記述します。
const findProduct = async () => {
const foundProduct = await Product.findOne({ name: 'マウンテンバイク' });
await foundProduct.toggleOnSale();
}
このようにすることで、スキーマ定義した「onSale」は「true/false」で切り替えるこ
とができます。
staticメソッド・・・
モデル自身が使えるメソッドであり、モデルと紐付いています。
〜書き方〜
サンプルとして「在庫処理で0円、全商品セール中!」みたいなメソッドを作成します。
この場合のthisは「 Product」自身
//staticsメソッド
productSchema.statics.fireSale = function () {
return this.updateMany({}, { onSale: true, price: 0 });
}
const Product = mongoose.model('Product', productSchema);
//実行
Product.fireSale().then(msg => console.log(msg))
これも非同期処理になるので、「then」を一緒に記述します。
インスタンスメソッド・staticメソッドの詳細が書かれています。