駆け出しのエンジニア日記

プログラミング言語勉強中の奮闘日記

スキーマにメソッドを追加してみる

インスタンスメソッド・・・

クラスから生成されたインスタンスから使えるメソッド

サンプルを見てみましょう。

//スキーマ定義
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がメソッドになります。つまりインスタンスメソッドです。

 

上記のスキーマに対して自作のインスタンスメソッドを記述してみましょう。

〜書き方〜

スキーマ.methods.メソッド名 = function () {
 〜〜〜処理内容〜〜〜
}

サンプルで商品に対し、セール中かセール中じゃないかの判別をつけるメソッドを用意します。

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メソッド・・・

モデル自身が使えるメソッドであり、モデルと紐付いています。

〜書き方〜

スキーマ.statics.メソッド名 = function () {
 〜〜〜処理内容〜〜〜
}

サンプルとして「在庫処理で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メソッドの詳細が書かれています。

mongoosejs.com