第六课:数据库集成: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 分钟前
【Task02】:四步构建简单rag(第一章3节)
android·java·数据库
小奋斗28 分钟前
深入浅出:JavaScript中 三大异步编程方案以及应用
javascript·面试
尝尝你的优乐美32 分钟前
封装那些Vue3.0中好用的指令
前端·javascript·vue.js
敲代码的彭于晏35 分钟前
localStorage 不够用?试试 IndexedDB !
前端·javascript·浏览器
chxii37 分钟前
5.4 4pnpm 使用介绍
前端·javascript·vue.js
····懂···1 小时前
攻克PostgreSQL专家认证
数据库·postgresql
米开朗积德1 小时前
项目多文件JSON数值比对
javascript
每天都在想吃啥1 小时前
day31 SQLITE
数据库·sqlite
sorryhc1 小时前
【AI解读源码系列】ant design mobile——Image图片
前端·javascript·react.js
sorryhc2 小时前
【AI解读源码系列】ant design mobile——Button按钮
前端·javascript·react.js