本文詳細介紹了如何在Node.js應用程序中集成MongoDB數據庫,并使用Mongoose庫進行數據操作。我們將涵蓋MongoDB在Ubuntu 20系統中的安裝、Bash命令的CRUD操作、Mongoose數據建模(Schema/Model)、關聯查詢與聚合管道,以及實戰案例——用戶注冊系統的開發。通過本文,你將掌握Node.js與MongoDB集成的完整流程。
1. MongoDB在Ubuntu 20系統中安裝與Bash命令的CRUD操作
1.1 MongoDB安裝
在Ubuntu 20系統中安裝MongoDB,你可以通過以下步驟進行:
方法一:直接安裝
導入公共GPG密鑰
wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add -
創建MongoDB源列表文件
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
更新軟件包列表并安裝MongoDB
sudo apt-get updatesudo apt-get install -y mongodb-org
啟動MongoDB服務
sudo systemctl start mongodsudo systemctl enable mongod
方法二:使用Docker鏡像
如果你更喜歡使用Docker來管理MongoDB,可以使用以下命令:
docker pull mongodocker run -itd --name mongo_latest -p 27017:27017 mongo
然后,你可以通過docker exec -it mongo_latest mongosh進入MongoDB shell。
1.2 Bash命令的CRUD操作
增操作
mongouse myDatabasedb.users.insert({name: "deming_su", age: 22, email: "deming_su@163.com"})
查操作
db.users.find()
更操作
db.users.updateOne({name: "deming_su"}, {$set: {age: 23}})
刪操作
db.users.deleteOne({name: "deming_su"})
2. Mongoose數據建模(Schema/Model)
2.1 Mongoose安裝
首先,確保你的Node.js環境已經安裝完畢,然后通過npm安裝Mongoose:
npm install mongoose
2.2 定義Schema
Schema是Mongoose中用于定義文檔結構的藍圖。以下是一個簡單的用戶Schema示例:
const mongoose = require('mongoose');const userSchema = new mongoose.Schema({id: String,name: String,age: Number,email: {type: String,unique: true}
});
2.3 創建Model
Model是Schema的編譯版本,用于創建和操作數據庫中的文檔。你可以使用mongoose.model方法創建Model:
const User = mongoose.model('User', userSchema);
2.4 CRUD操作
使用Mongoose進行CRUD操作非常簡單。以下是一些示例:
增操作
const mongoose = require('mongoose');
const User = require('./models/user');mongoose.connect('mongodb://localhost:27017/myDatabase', {useNewUrlParser: true,useUnifiedTopology: true
});const newUser = new User({id: "deming_su", name: "deming_su", age: 28, email: "deming_su@163.com"});newUser.save();
查操作
User.find({id: "deming_su"}, (err, users) => {if (err) {console.error(err);} else {console.log(users);}
});
更操作
User.findByIdAndUpdate('deming_su', {$set: {age: 29}}, (err, user) => {if (err) {console.error(err);} else {console.log(user);}
});
刪操作
User.findByIdAndDelete('deming_su', (err, user) => {if (err) {console.error(err);} else {console.log(user);}
});
3. 關聯查詢與聚合管道
3.1 關聯查詢
在MongoDB中,關聯查詢通常通過$lookup操作符在聚合管道中實現。假設我們有兩個集合:users和orders,每個訂單都屬于一個用戶,我們可以通過user_id字段進行關聯查詢。
User.aggregate([{$lookup: {from: 'orders',localField: '_id',foreignField: 'user_id',as: 'orders'}}
]).exec((err, users) => {if (err) {console.error(err);} else {console.log(users);}
});
3.2 聚合管道
聚合管道允許你對集合中的文檔進行一系列復雜的轉換和聚合操作。以下是一個簡單的聚合管道示例,用于統計每個用戶的訂單總數:
Order.aggregate([{$group: {_id: '$user_id',totalOrders: { $sum: 1 }}}
]).exec((err, results) => {if (err) {console.error(err);} else {console.log(results);}
});
4. 實戰:用戶注冊系統開發
4.1 系統設計
用戶注冊系統需要實現以下功能:
- 用戶注冊:收集用戶信息(如用戶名、密碼、郵箱等)并保存到數據庫。
- 用戶登錄:驗證用戶信息并登錄系統。
- 用戶注銷:清除用戶會話并注銷系統。
4.2 數據建模
首先,我們需要定義用戶數據模型。使用Mongoose,我們可以創建一個簡單的用戶Schema:
const mongoose = require('mongoose');const userSchema = new mongoose.Schema({username: {type: String,required: true,unique: true},password: {type: String,required: true},email: {type: String,required: true,unique: true}
});
4.3 實現注冊功能
前端(HTML + JavaScript)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>User Registration</title>
</head>
<body><form id="registerForm"><label for="username">Username:</label><input type="text" id="username" name="username" required><br><br><label for="password">Password:</label><input type="password" id="password" name="password" required><br><br><label for="email">Email:</label><input type="email" id="email" name="email" required><br><br><button type="submit">Register</button></form><script>document.getElementById('registerForm').addEventListener('submit', async function(event) {event.preventDefault();const username = document.getElementById('username').value;const password = document.getElementById('password').value;const email = document.getElementById('email').value;const response = await fetch('/register', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ username, password, email })});const result = await response.json();if (result.success) {alert('Registration successful!');} else {alert('Registration failed: ' + result.message);}});</script>
</body>
</html>
后端(Node.js + Express + Mongoose)
const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');const app = express();
const port = 3000;mongoose.connect('mongodb://localhost:27017/userRegistration', {useNewUrlParser: true,useUnifiedTopology: true
});app.use(bodyParser.json());const User = require('./models/user');app.post('/register', async (req, res) => {const { username, password, email } = req.body;try {const user = new User({ username, password, email });await user.save();res.json({ success: true });} catch (err) {res.json({ success: false, message: err.message });}
});app.listen(port, () => {console.log(`Server is running on http://localhost:${port}`);
});
4.4 實現登錄和注銷功能
登錄和注銷功能的實現與注冊類似,這里不再贅述。你可以參考上述代碼,通過發送POST請求到/login和/logout端點來實現用戶登錄和注銷功能。
結語
通過本文,你了解了如何在Node.js應用程序中集成MongoDB數據庫,并使用Mongoose庫進行數據操作。我們涵蓋了MongoDB的安裝、Bash命令的CRUD操作、Mongoose數據建模、關聯查詢與聚合管道,以及實戰案例——用戶注冊系統的開發。希望這些內容對你有所幫助,讓你能夠更好地掌握Node.js與MongoDB的集成技術。
關注我!!🫵 持續為你帶來Nodejs相關內容。