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

打印 上一主题 下一主题

主题 1031|帖子 1031|积分 3093

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本文具体介绍了如何在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密钥
  1. wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add -
复制代码
创建MongoDB源列表文件
  1. 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
  1. sudo apt-get update
  2. sudo apt-get install -y mongodb-org
复制代码
启动MongoDB服务
  1. sudo systemctl start mongod
  2. sudo systemctl enable mongod
复制代码
方法二:使用Docker镜像
如果你更喜好使用Docker来管理MongoDB,可以使用以下下令:
  1. docker pull mongo
  2. docker run -itd --name mongo_latest -p 27017:27017 mongo
复制代码
然后,你可以通过docker exec -it mongo_latest mongosh进入MongoDB shell
1.2 Bash下令的CRUD操纵

增操纵
  1. mongo
  2. use myDatabase
  3. db.users.insert({name: "deming_su", age: 22, email: "deming_su@163.com"})
复制代码
查操纵
  1. db.users.find()
复制代码
更操纵
  1. db.users.updateOne({name: "deming_su"}, {$set: {age: 23}})
复制代码
删操纵
  1. db.users.deleteOne({name: "deming_su"})
复制代码
2. Mongoose数据建模(Schema/Model)

2.1 Mongoose安装

首先,确保你的Node.js环境已经安装完毕,然后通过npm安装Mongoose:
  1. npm install mongoose
复制代码
2.2 定义Schema
Schema是Mongoose中用于定义文档布局的蓝图。以下是一个简单的用户Schema示例:
  1. const mongoose = require('mongoose');
  2. const userSchema = new mongoose.Schema({
  3.     id: String,
  4.     name: String,
  5.     age: Number,
  6.     email: {
  7.         type: String,
  8.         unique: true
  9.     }
  10. });
复制代码
2.3 创建Model

Model是Schema的编译版本,用于创建和操纵数据库中的文档。你可以使用mongoose.model方法创建Model:
  1. const User = mongoose.model('User', userSchema);
复制代码
2.4 CRUD操纵

使用Mongoose举行CRUD操纵非常简单。以下是一些示例:
增操纵
  1. const mongoose = require('mongoose');
  2. const User = require('./models/user');
  3. mongoose.connect('mongodb://localhost:27017/myDatabase', {
  4.     useNewUrlParser: true,
  5.     useUnifiedTopology: true
  6. });
  7. const newUser = new User({id: "deming_su", name: "deming_su", age: 28, email: "deming_su@163.com"});
  8. newUser.save();
复制代码
查操纵
  1. User.find({id: "deming_su"}, (err, users) => {
  2.     if (err) {
  3.         console.error(err);
  4.     } else {
  5.         console.log(users);
  6.     }
  7. });
复制代码
更操纵
  1. User.findByIdAndUpdate('deming_su', {$set: {age: 29}}, (err, user) => {
  2.     if (err) {
  3.         console.error(err);
  4.     } else {
  5.         console.log(user);
  6.     }
  7. });
复制代码
删操纵
  1. User.findByIdAndDelete('deming_su', (err, user) => {
  2.     if (err) {
  3.         console.error(err);
  4.     } else {
  5.         console.log(user);
  6.     }
  7. });
复制代码
3. 关联查询与聚合管道

3.1 关联查询

在MongoDB中,关联查询通常通过$lookup操纵符在聚合管道中实现。假设我们有两个集合:users和orders,每个订单都属于一个用户,我们可以通过user_id字段举行关联查询。
  1. User.aggregate([
  2.     {
  3.         $lookup: {
  4.             from: 'orders',
  5.             localField: '_id',
  6.             foreignField: 'user_id',
  7.             as: 'orders'
  8.         }
  9.     }
  10. ]).exec((err, users) => {
  11.     if (err) {
  12.         console.error(err);
  13.     } else {
  14.         console.log(users);
  15.     }
  16. });
复制代码
3.2 聚合管道

聚合管道允许你对集合中的文档举行一系列复杂的转换和聚合操纵。以下是一个简单的聚合管道示例,用于统计每个用户的订单总数:
  1. Order.aggregate([
  2.     {
  3.         $group: {
  4.             _id: '$user_id',
  5.             totalOrders: { $sum: 1 }
  6.         }
  7.     }
  8. ]).exec((err, results) => {
  9.     if (err) {
  10.         console.error(err);
  11.     } else {
  12.         console.log(results);
  13.     }
  14. });
复制代码
4. 实战:用户注册系统开辟

4.1 系统计划

用户注册系统需要实现以下功能:


  • 用户注册:网络用户信息(如用户名、密码、邮箱等)并保存到数据库。
  • 用户登录:验证用户信息并登录系统。
  • 用户注销:清除用户会话并注销系统。
4.2 数据建模

首先,我们需要定义用户数据模子。使用Mongoose,我们可以创建一个简单的用户Schema:
  1. const mongoose = require('mongoose');
  2. const userSchema = new mongoose.Schema({
  3.     username: {
  4.         type: String,
  5.         required: true,
  6.         unique: true
  7.     },
  8.     password: {
  9.         type: String,
  10.         required: true
  11.     },
  12.     email: {
  13.         type: String,
  14.         required: true,
  15.         unique: true
  16.     }
  17. });
复制代码
4.3 实现注册功能

前端(HTML + JavaScript)
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>User Registration</title>
  7. </head>
  8. <body>
  9.     <form id="registerForm">
  10.         <label for="username">Username:</label>
  11.         <input type="text" id="username" name="username" required><br><br>
  12.         <label for="password">Password:</label>
  13.         <input type="password" id="password" name="password" required><br><br>
  14.         <label for="email">Email:</label>
  15.         <input type="email" id="email" name="email" required><br><br>
  16.         <button type="submit">Register</button>
  17.     </form>
  18.     <script>
  19.         document.getElementById('registerForm').addEventListener('submit', async function(event) {
  20.             event.preventDefault();
  21.             const username = document.getElementById('username').value;
  22.             const password = document.getElementById('password').value;
  23.             const email = document.getElementById('email').value;
  24.             const response = await fetch('/register', {
  25.                 method: 'POST',
  26.                 headers: {
  27.                     'Content-Type': 'application/json'
  28.                 },
  29.                 body: JSON.stringify({ username, password, email })
  30.             });
  31.             const result = await response.json();
  32.             if (result.success) {
  33.                 alert('Registration successful!');
  34.             } else {
  35.                 alert('Registration failed: ' + result.message);
  36.             }
  37.         });
  38.     </script>
  39. </body>
  40. </html>
复制代码
后端(Node.js + Express + Mongoose)
  1. const express = require('express');
  2. const mongoose = require('mongoose');
  3. const bodyParser = require('body-parser');
  4. const app = express();
  5. const port = 3000;
  6. mongoose.connect('mongodb://localhost:27017/userRegistration', {
  7.     useNewUrlParser: true,
  8.     useUnifiedTopology: true
  9. });
  10. app.use(bodyParser.json());
  11. const User = require('./models/user');
  12. app.post('/register', async (req, res) => {
  13.     const { username, password, email } = req.body;
  14.     try {
  15.         const user = new User({ username, password, email });
  16.         await user.save();
  17.         res.json({ success: true });
  18.     } catch (err) {
  19.         res.json({ success: false, message: err.message });
  20.     }
  21. });
  22. app.listen(port, () => {
  23.     console.log(`Server is running on http://localhost:${port}`);
  24. });
复制代码
4.4 实现登录和注销功能

登录和注销功能的实现与注册类似,这里不再赘述。你可以参考上述代码,通过发送POST请求到/login和/logout端点来实现用户登录和注销功能。
结语

通过本文,你了解了如何在Node.js应用程序中集成MongoDB数据库,并使用Mongoose库举行数据操纵。我们涵盖了MongoDB的安装、Bash下令的CRUD操纵、Mongoose数据建模、关联查询与聚合管道,以及实战案例——用户注册系统的开辟。盼望这些内容对你有所帮助,让你可以或许更好地把握Node.js与MongoDB的集成技能。
关注我!!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

饭宝

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表