iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0
自我挑戰組

30 天 Node.js 探索:基礎、進階與實踐系列 第 12

Day 12: 資料庫連接:使用 MongoDB 與 Mongoose

  • 分享至 

  • xImage
  •  

接著要學習如何使用 MongoDB 當作是 Node.js 應用程式的資料庫,然後透過 Mongoose 庫來去簡化資料操作。

什麼是 MongoDB?

MongoDB 是一個 NoSQL 資料庫,它以文件(document) 的形式來去儲存資料,而且使用 JSON-like 的 BSON 格式。這種結構與傳統的關聯型資料庫不同,它比較靈活,特別適合處理大型分散式數據及動態結構的資料。

  • NoSQL 資料庫: 不使用表格與關聯,數據以文件形式存儲,類似 JSON 結構。
  • 靈活的結構: 文件結構可以根據需要動態擴展,非常適合快節奏的開發。
    https://ithelp.ithome.com.tw/upload/images/20240924/20169444nBSOv3mKdg.png

什麼是 Mongoose?

Mongoose 是一個基於 Node.js 的 MongoDB ODM(Object Data Modeling)庫,用於在應用程式中定義數據模式並進行 MongoDB 資料操作。它提供了強大的驗證功能、資料操作接口,並簡化了與 MongoDB 的連接和操作。
https://ithelp.ithome.com.tw/upload/images/20240924/20169444gT2SrWmQR7.png

安裝 MongoDB 和 Mongoose

安裝 MongoDB

  1. 首先安裝 MongoDB 伺服器,可以到官方網站的安裝指南去下載:
    https://www.mongodb.com/zh-cn/docs/manual/tutorial/install-mongodb-on-windows/
    https://ithelp.ithome.com.tw/upload/images/20240924/20169444EPbBTNdqOE.png
    到了這邊之後直接點選 MongoDB 下載中心:
    https://ithelp.ithome.com.tw/upload/images/20240924/20169444rXDT9UVJSj.png
    接著就可以依照版本需求去進行安裝了。
  2. 啟動 MongoDB:
bash
mongod
  1. 安裝 Mongoose 在 Node.js 專案中,使用 npm 安裝 Mongoose:
bash
npm install mongoose
  1. 使用 Mongoose 連接到 MongoDB
    接下來要示範怎麼使用 Mongoose 連接到 MongoDB 並操作資料庫。
    ** 此為舊版示範**
js
const mongoose = require('mongoose');

// 連接到 MongoDB
mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true })
  .then(() => console.log('Connected to MongoDB'))
  .catch(err => console.error('Could not connect to MongoDB', err));

實際打入 Node.js ,執行結果會如下:
https://ithelp.ithome.com.tw/upload/images/20240924/20169444MxPP71gKI3.png
可以看到這邊跳出錯誤訊息,這是因為從 MongoDB 驅動程式 4.0.0 版本開始,useUnifiedTopology 和 useNewUrlParser 一樣,成為了默認行為,因此不再需要設置它,所以更改程式後變成:
https://ithelp.ithome.com.tw/upload/images/20240924/201694446lechvMO4r.png
這段代碼透過 Mongoose 連接到位於本機的 MongoDB 伺服器,並指定要連接的資料庫 mydatabase。

定義資料模型

Mongoose 使用 Schema 定義資料的結構。接下來我們定義一個 User 模型,用來表示使用者資料。

js
const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true,
    unique: true
  },
  age: {
    type: Number,
    min: 18
  }
});

// 建立模型
const User = mongoose.model('User', userSchema);

實際打入 Node.js ,執行結果會如下:
https://ithelp.ithome.com.tw/upload/images/20240925/20169444keCKCPbQ75.png
在這裡定義了一個 User 的 Schema,包含使用者的 name、email 和 age 三個屬性。Mongoose 提供了資料驗證功能,例如要求 name 和 email 欄位必填、email 欄位唯一、age 必須大於等於 18。

CRUD 操作:新增、查詢、更新、刪除資料

新增資料(Create):

js
async function createUser() {
  const user = new User({
    name: 'Jimmy Chen',
    email: 'jimmy@example.com',
    age: 20
  });
  const result = await user.save();
  console.log(result);
}

createUser();

在 MongoDB 執行結果如下:
https://ithelp.ithome.com.tw/upload/images/20240925/20169444041uox4U7L.png

查詢資料(Read):

js
async function getUsers() {
  const users = await User.find();
  console.log(users);
}

getUsers();

更新資料(Update):

js
async function updateUser(id) {
  const user = await User.findByIdAndUpdate(id, { 
    name: 'Jimmy Chen' 
  }, { new: true });
  console.log(user);
}

updateUser('USER_ID');

刪除資料(Delete):

js
async function deleteUser(id) {
  const result = await User.findByIdAndDelete(id);
  console.log(result);
}

deleteUser('USER_ID');

使用 Mongoose 的其他功能

  • 驗證資料: Mongoose 內建了資料驗證功能,如 required、unique、minLength 等,可以保證資料的完整性。
  • 虛擬屬性(Virtuals): 可以定義不存儲在資料庫中的屬性,這些屬性可以基於其他屬性進行計算。
  • 中介軟體(Middleware): Mongoose 支援在資料存取過程中定義預先或後置的處理函數。

簡單的 RESTful API 整合 MongoDB

最後將前面學到的 Mongoose 與 Express 結合,就可以構建一個簡單的 API 來處理 MongoDB 中的資料。

js
const express = require('express');
const mongoose = require('mongoose');

const app = express();
app.use(express.json());

// 連接 MongoDB
mongoose.connect('mongodb://localhost:27017/mydatabase', )//{ useNewUrlParser: true, useUnifiedTopology: true })
  .then(() => console.log('Connected to MongoDB'))
  .catch(err => console.error('Could not connect to MongoDB', err));

// 定義使用者資料模型
const userSchema = new mongoose.Schema({
  name: String,
  email: String,
  age: Number
});

const User = mongoose.model('User', userSchema);

// API 路由

// 取得所有使用者
app.get('/users', async (req, res) => {
  const users = await User.find();
  res.send(users);
});

// 新增使用者
app.post('/users', async (req, res) => {
  const user = new User(req.body);
  await user.save();
  res.send(user);
});

// 更新使用者
app.put('/users/:id', async (req, res) => {
  const user = await User.findByIdAndUpdate(req.params.id, req.body, { new: true });
  res.send(user);
});

// 刪除使用者
app.delete('/users/:id', async (req, res) => {
  const user = await User.findByIdAndDelete(req.params.id);
  res.send(user);
});

// 啟動伺服器
app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

https://ithelp.ithome.com.tw/upload/images/20240925/20169444qJY8SmOLpl.png

總結

今天學習了如何使用 MongoDB 和 Mongoose 來管理 Node.js 應用程式的資料。了解了如何定義資料模型並進行 CRUD 操作,並且透過 Express 框架將 MongoDB 資料操作整合進 API。最後成功做了一個小實作!在接下來的實作中,將進一步探索如何優化資料庫查詢並處理更複雜的資料邏輯。


上一篇
Day 11:REST API 基礎與 Express 結合
下一篇
Day 13: 資料庫操作與 CRUD
系列文
30 天 Node.js 探索:基礎、進階與實踐30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言