第六课:数据库集成:MongoDB与Mongoose技术应用

本文详细介绍了如何在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密钥

bash 复制代码
wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add -

创建MongoDB源列表文件

bash 复制代码
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

bash 复制代码
sudo apt-get update

sudo apt-get install -y mongodb-org

启动MongoDB服务

bash 复制代码
sudo systemctl start mongod

sudo systemctl enable mongod

方法二:使用Docker镜像

如果你更喜欢使用Docker来管理MongoDB,可以使用以下命令:

bash 复制代码
docker pull mongo

docker run -itd --name mongo_latest -p 27017:27017 mongo

然后,你可以通过docker exec -it mongo_latest mongosh 进入MongoDB shell

1.2 Bash命令的CRUD操作

增操作

bash 复制代码
mongo

use myDatabase

db.users.insert({name: "deming_su", age: 22, email: "deming_su@163.com"})

查操作

bash 复制代码
db.users.find()

更操作

bash 复制代码
db.users.updateOne({name: "deming_su"}, {$set: {age: 23}})

删操作

bash 复制代码
db.users.deleteOne({name: "deming_su"})

2. Mongoose数据建模(Schema/Model)

2.1 Mongoose安装

首先,确保你的Node.js环境已经安装完毕,然后通过npm安装Mongoose:

bash 复制代码
npm install mongoose

2.2 定义Schema

Schema是Mongoose中用于定义文档结构的蓝图。以下是一个简单的用户Schema示例:

javascript 复制代码
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:

javascript 复制代码
const User = mongoose.model('User', userSchema);
2.4 CRUD操作

使用Mongoose进行CRUD操作非常简单。以下是一些示例:

增操作

javascript 复制代码
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();

查操作

javascript 复制代码
User.find({id: "deming_su"}, (err, users) => {
    if (err) {
        console.error(err);
    } else {
        console.log(users);
    }
});

更操作

javascript 复制代码
User.findByIdAndUpdate('deming_su', {$set: {age: 29}}, (err, user) => {
    if (err) {
        console.error(err);
    } else {
        console.log(user);
    }
});

删操作

javascript 复制代码
User.findByIdAndDelete('deming_su', (err, user) => {
    if (err) {
        console.error(err);
    } else {
        console.log(user);
    }
});

3. 关联查询与聚合管道

3.1 关联查询

在MongoDB中,关联查询通常通过$lookup操作符在聚合管道中实现。假设我们有两个集合:users和orders,每个订单都属于一个用户,我们可以通过user_id字段进行关联查询。

javascript 复制代码
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 聚合管道

聚合管道允许你对集合中的文档进行一系列复杂的转换和聚合操作。以下是一个简单的聚合管道示例,用于统计每个用户的订单总数:

javascript 复制代码
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:

javascript 复制代码
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)

html 复制代码
<!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)

javascript 复制代码
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相关内容。

相关推荐
颜酱5 分钟前
后台系统从零搭建(三)—— 具体页面之菜单管理和角色管理
前端·javascript·react.js
洛北辰南8 分钟前
系统架构设计师—数据库基础篇—数据库优化技术
数据库·系统架构·优化技术
OpenTiny社区10 分钟前
Node.js 技术原理分析系列5——理解 Node.js 中的 ABI 稳定
前端·node.js
egekm_sefg10 分钟前
Node.js调用DeepSeek Api 实现本地智能聊天的简单应用
node.js
the_one21 分钟前
手写 AJAX:从零实现一个简洁的异步请求函数
前端·javascript
xulihang22 分钟前
vCard名片二维码在前端的生成与扫描
前端·javascript·图像识别
大数据魔法师23 分钟前
MongoDB(二) - MongoDB命令详解
数据库·mongodb
kse_music24 分钟前
MySQL 与 MongoDB 的区别
数据库·mysql·mongodb
yqcoder25 分钟前
Express + MongoDB 实现登录验证码
数据库·mongodb·express
田猿笔记28 分钟前
FerretDB 2.0:开源 MongoDB 替代品的安装与使用指南
数据库·开源·ferretdb