(17)被迫吃芒果的前端工程師 - Mongoose 之 Instance methods

前言

本身 Mongoose 有提供相當多好用的內建方法,但是有時候可能我們需求比較特別,那麼當然也可以自己定義方法。

Instance methods

Instance methods 是 Mongoose 提供給我的可以自定義的方法的地方,用法其實非常簡單,只需要在 Schema 後面加上 methods 就可以了,這邊你可以試著打開 models/User.js 然後在 userSchema 後面開始撰寫

1
2
3
4
5
6
7
const userSchema = new mongoose.Schema({
... // 忽略
});

userSchema.methods.xxxxx = function() {
return .... // 方法
}

舉例來講今天我們想要取得自己是民國幾年出生,那麼就用今年去減掉年齡就可以了

1
2
3
userSchema.methods.getBirthYear = function() {
return new Date().getFullYear() - this.age;
}

這邊要注意不要使用箭頭函式,因為 this 會指向到資料內,而這邊概念其實跟原型非常像,如果你對 this 不熟悉的話,可以參考這一篇

那麼該如何使用自己定義的 getBirthYear 呢?只需要在 findOne 回傳結果時加上該方法就可以使用了

1
2
3
4
User.findOne({nickname: 'RayXu'}).then((data) => {
console.log('data', data);
console.log('getBirthYear', data.getBirthYear());
})

輸出結果

但是這邊要注意如果你使用的是 find 的話,因為他回傳的是一個陣列,因此必須這樣寫才可以運作

1
2
3
4
5
User.find({}).then((data) => {
data.forEach((item) => {
console.log(item.nickname, 'getBirthYear', item.getBirthYear());
})
})

getBirthYear

當然這種方式也可以用於儲存資料,例如呼叫之後自動年齡增加並儲存

1
2
3
4
userSchema.methods.addAge = function() {
this.age++;
this.save();
}

透過這個方式當你搜尋到之後,你可以自動增加年齡並儲存。

1
2
3
4
5
User.find({}).then((data) => {
data.forEach((item) => {
item.addAge();
})
})

更新前

更新後