本文详细介绍了如何在Node.js应用程序中集成MongoDB数据库,并使用Mongoose库进行数据操作。我们将涵盖MongoDB在Ubuntu 20系统中的安装、Bash命令的CRUD操作、Mongoose数据建模(Schema/Model)、关联查询与聚合管道,以及实战案例——用户注册系统的开发。通过本文,你将掌握Node.js与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 update
sudo apt-get install -y mongodb-org
启动MongoDB服务
sudo systemctl start mongod
sudo systemctl enable mongod
方法二:使用Docker镜像
如果你更喜欢使用Docker来管理MongoDB,可以使用以下命令:
docker pull mongo
docker run -itd --name mongo_latest -p 27017:27017 mongo
然后,你可以通过docker exec -it mongo_latest mongosh进入MongoDB shell。
增操作
mongo
use myDatabase
db.users.insert({name: "deming_su", age: 22, email: "[email protected]"})
查操作
db.users.find()
更操作
db.users.updateOne({name: "deming_su"}, {$set: {age: 23}})
删操作
db.users.deleteOne({name: "deming_su"})
首先,确保你的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
}
});
Model是Schema的编译版本,用于创建和操作数据库中的文档。你可以使用mongoose.model方法创建Model:
const User = mongoose.model('User', userSchema);
使用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: "[email protected]"});
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);
}
});
在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);
}
});
聚合管道允许你对集合中的文档进行一系列复杂的转换和聚合操作。以下是一个简单的聚合管道示例,用于统计每个用户的订单总数:
Order.aggregate([
{
$group: {
_id: '$user_id',
totalOrders: { $sum: 1 }
}
}
]).exec((err, results) => {
if (err) {
console.error(err);
} else {
console.log(results);
}
});
用户注册系统需要实现以下功能:
首先,我们需要定义用户数据模型。使用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
}
});
前端(HTML + JavaScript)
User Registration
后端(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}`);
});
登录和注销功能的实现与注册类似,这里不再赘述。你可以参考上述代码,通过发送POST请求到/login和/logout端点来实现用户登录和注销功能。
通过本文,你了解了如何在Node.js应用程序中集成MongoDB数据库,并使用Mongoose库进行数据操作。我们涵盖了MongoDB的安装、Bash命令的CRUD操作、Mongoose数据建模、关联查询与聚合管道,以及实战案例——用户注册系统的开发。希望这些内容对你有所帮助,让你能够更好地掌握Node.js与MongoDB的集成技术。
关注我!! 持续为你带来Nodejs相关内容。