Mongoose (2) 建立model與schema
Mongoose 觀念與名詞
Mongoose 提供了 schema-based 的解決方案讓我們直接操作資料,在透過 Mongoose 操作資料庫時,有幾個名詞要先有概念:
- Schema: 存資料庫模型的檔案
 - Model: 由 Schema 當參數產生的 instance 可以用來操作資料庫
 - collection: 在 MongoDB 中的表
 
Mongoose Schema 設計
要使用 Mongoose 操作的第一步就是要從定義 Schema 開始,定義完成後 Schema 會自動對應到 MongoDB 中的一個 collection,另外因為不像傳統資料庫那樣有 join 的概念,所以拿資料的時候可以依照我們的使用情境去設計,像是以撈取為主的話就可以透過雙向參照的設計去加速,詳細可以參考MongoDB Schema 設計指南。
建立 Schema


在model資料夾裡,建立js檔,並利用 monggose.Schema({}),來建立所有document的結構。只有在 Schema 裡建立的屬性如 name,才會傳入mogodb資料庫。
建立好 Schema 結構, 在將schema建立成一個model實體 可以用來操作資料庫(crud)。
1  | module.exports = mongoose.model('Product', productSchema);  | 
schema 拆分

當要定義的物件過於複雜時,可以另外拆分一個schema來定義,如上圖address的值是定義在 addressSchema裡。
schema 驗證

schema 裡資料格式的也可做驗證,可用方法:
- type: String | Number | Boolean | Date // 指定屬性的型別
 - required: true | false //是否必填
 - trim: true | false //是否去頭尾空白
 - maxlength: 最多字數。
 - min: 最小值。
 - max: 最大值。
 - default: 預設值。
 - lowercase: true | false //是否要小寫
 - uppercase: true | false //是否要大寫
 - immutable: true | false //是否可修改
 
補充日期預設方法:
1  | createAt: {  | 
validate: 自訂驗證函式(validator),並可回傳message

schema 加上方法
我們可以在 schema加上方法,讓每個new出來的document使用。
1  | const person = new mongoose.Schema({  | 
方法建立在schema可以在每個實體使用
1  | const person = await person.find({ name: 'Kyle' });  | 
model操作資料

在我們controllers裡的js檔裡,可以將剛才export的model引入。

上面是post方法對應的函式,可以使用 Task.create()方法,將使用者傳來的資料,建立成一筆 document。詳細的Model操作方法下一章節介紹。