Mongoose ODM 操作 Mongo DB 常見專案架構設計

me
林彥成
2019-09-07 | 2 min.

這篇文章將介紹使用 Mongoose ODM (Object Data Model) 建立 Model,使用其連接並操作 MongoDB。

什麼是 ODM/ORM?

由於 Express 這類框架無法操作資料庫,所以將資料表示為 JavaScript 的 Object,再透過 ODM/ORM 工具定義的 data schema 去操作資料庫,透過 Mongoose 就可以達到操作資料庫的目的,ODM/ORM通常可以降低開發及維護成本,因此一般情況下都推薦使用。

  • ODM: Object Data Model,對應 NoSQL Database
  • ORM: Object Relational Model,對應 SQL-Bsaed Database

Mongo DB 資料庫設定

最常用的就是運用 Mongoose 搭配 Mongo DB:

  1. 在安裝完 Mongo 後,進入 shell 去連線看看 mongo --port 27017
  2. 成功連線後可以選擇資料庫開始下指令,像是 use test
  3. 進入 test 中設定使用者及權限:
1
2
3
4
5
6
db.dropAllUsers()
db.createUser({
user: "test",
pwd: "test",
roles: [{ role: "readWrite", db: "test" }]
})
  1. 資料庫為了安全起見會要將資料庫的 authorization 打開,windos 請參考連結,ubuntu 請去編輯 etc 資料夾底下的芒果設定,加入設定如下:
1
2
security:
authorization: enabled

Mongoose 專案架構

在網路上有看到常見的兩種架構:

1
2
3
4
5
6
7
8
9
10
11
├── src/
│ ├── entities/ # 按照資料表去區分
│ │ └── user/ # 使用者表
│ │ ├── model.js # Schema 定義
│ │ ├── controller.js # 資料庫 CRUD
│ │ └── route.js # API 設定
│ └── index.js # 入口
├── .eslintrc # ESLint 設定檔
├── package-lock.json
├── package.json
└── README.md
1
2
3
4
5
6
7
8
9
├── src/
│ ├── controller/ # 資料庫 CRUD
│ ├── routes/ # API 設定
│ ├── models/ # Schema 定義
│ └── index.js # 程式入口
├── .eslintrc # ESLint 設定檔
├── package-lock.json
├── package.json
└── README.md

操作 Mongoose

Mongoose 則是協助我們在 node.js 專案中操作 Mongo DB,在程式中定義好 schema (不需要開欄位),確認資料庫連線沒有問題就可以直接開始操作了。

比較大的問題是 node.js 不像 C#.net 那樣的語言有工具可以自動產生程式碼和架構,所以這個部分就是看每個人的狀況去放置,但還是以關注點分離的概念為主:

  • 在 model 中定義 Schema
  • 在 controller 中撈資料
1
2
3
4
5
6
7
8
9
10
/**
* user model
*/
const mongoose = require("mongoose");

const userSchema = mongoose.Schema({
id: String,
});

module.exports = mongoose.model("user", userSchema);
1
2
3
4
5
6
7
8
9
10
11
12
/**
* user controller
*/

const getUser = (id) => {
return new Promise((resolve, reject) => {
const User = require("./model");
User.findOne({ id }).exec((error, docs) => {
resolve(docs);
});
});
};

Mongoose schema 設計

因為不像傳統資料庫那樣有 join 的概念,所以拿資料的時候可以依照我們的使用情境去設計,像是以撈取為主的話就可以透過雙向參照的設計去加速,詳細可以參考MongoDB Schema 設計指南,分類有以下幾種:

  • Modeling One-to-Few 少量級關聯模式 (Embedding)
  • One-to-Many 多量級關聯模式 (Child-Referencing)
  • One-to-Squillions 海量級關聯模式 (Parent-Referencing)
  • Two-Way Referencing (雙向參照設計)
  • 多對一反正規化 (Denormalizing from Many -> One)

喜歡這篇文章,請幫忙拍拍手喔 🤣

share