接著要學習如何使用 MongoDB 當作是 Node.js 應用程式的資料庫,然後透過 Mongoose 庫來去簡化資料操作。
MongoDB 是一個 NoSQL 資料庫,它以文件(document) 的形式來去儲存資料,而且使用 JSON-like 的 BSON 格式。這種結構與傳統的關聯型資料庫不同,它比較靈活,特別適合處理大型分散式數據及動態結構的資料。
Mongoose 是一個基於 Node.js 的 MongoDB ODM(Object Data Modeling)庫,用於在應用程式中定義數據模式並進行 MongoDB 資料操作。它提供了強大的驗證功能、資料操作接口,並簡化了與 MongoDB 的連接和操作。
bash
mongod
bash
npm install mongoose
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 ,執行結果會如下:
可以看到這邊跳出錯誤訊息,這是因為從 MongoDB 驅動程式 4.0.0 版本開始,useUnifiedTopology 和 useNewUrlParser 一樣,成為了默認行為,因此不再需要設置它,所以更改程式後變成:
這段代碼透過 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 ,執行結果會如下:
在這裡定義了一個 User 的 Schema,包含使用者的 name、email 和 age 三個屬性。Mongoose 提供了資料驗證功能,例如要求 name 和 email 欄位必填、email 欄位唯一、age 必須大於等於 18。
新增資料(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 執行結果如下:
查詢資料(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 與 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');
});
今天學習了如何使用 MongoDB 和 Mongoose 來管理 Node.js 應用程式的資料。了解了如何定義資料模型並進行 CRUD 操作,並且透過 Express 框架將 MongoDB 資料操作整合進 API。最後成功做了一個小實作!在接下來的實作中,將進一步探索如何優化資料庫查詢並處理更複雜的資料邏輯。