当前位置: 首页 > news >正文

【6/20】MongoDB 入门:连接数据库,实现数据存储与查询

标签:MongoDB、NoSQL 数据库、Node.js 连接、数据存储、查询操作、入门教程、项目实践

前言

欢迎来到“前后端与数据库交互详解”系列的第6篇文章!在前五篇文章中,我们从 Vue.js 前端起步,学习了组件、HTTP 请求(如天气查询),并用 Node.js 和 Express.js 构建了 RESTful API(如用户数据端点)。现在,API 需要持久化数据——模拟数组不够用,我们引入数据库。

本篇文章的焦点是 MongoDB 入门,特别是连接数据库并实现数据存储与查询。我们将解释 MongoDB 是什么、如何用 Node.js 连接它,并在结尾实现一个完整的“用户数据存储应用”:扩展第五篇的 Express API,用 MongoDB 替换数组,支持真实 CRUD 操作(Create, Read)。这将帮助您理解数据库交互,前端可以调用 API 操作数据。未来,我们将扩展到完整前后端整合。

前提:您已安装 Node.js 和 Express(从前文)。安装 MongoDB:下载社区版(https://www.mongodb.com/try/download/community),或用云服务如 MongoDB Atlas(免费层)。我们用 Mongoose(一个 ODM 库)简化连接:npm install mongoose

一、MongoDB 是什么?

MongoDB 是一个开源的 NoSQL 数据库,使用文档模型(JSON-like BSON)存储数据,而不是传统 SQL 的表格。

  • 为什么用 MongoDB?

    • 灵活性:无固定 schema,适合动态数据(如用户对象可变字段)。
    • 可扩展:水平扩展,支持大数据和高并发。
    • JSON 友好:数据像 JS 对象,便于 Node.js/Express 集成。
    • 对比 SQL(如 MySQL):NoSQL 更快用于非结构化数据;我们的系列用它简化入门。
    • 在前后端中的作用:后端 API(如第五篇)从 MongoDB 查询/存储数据,前端通过 HTTP 调用。
  • 核心概念

    • 数据库:一个 MongoDB 实例可有多个数据库。
    • 集合(Collection):类似 SQL 表,存储文档(e.g., users 集合)。
    • 文档(Document):JSON 对象,如 {name: “Alice”, email: “alice@example.com”}。
    • 查询:用 find() 获取数据,insertOne() 添加。
    • Mongoose:Node.js 的 ODM(Object Data Modeling),提供 schema 和模型,简化操作。

在我们的系列中,MongoDB 是数据层:它存储 API 数据,让应用持久化。

二、MongoDB 的基本使用

  1. 启动 MongoDB:运行 mongod(本地)或用 Atlas 获取连接字符串。
  2. 连接 Node.js:用 Mongoose mongoose.connect('mongodb://localhost:27017/mydb')
  3. 定义模型:创建 schema(如 UserSchema),然后 model(mongoose.model('User', UserSchema))。
  4. 操作数据
    • 查询:User.find() 返回所有。
    • 插入:new User(data).save()

示例:简单连接和查询(在 Express 中)。

接下来,通过项目实践这些。

三、实现完整项目:用户数据存储应用

项目目标:扩展第五篇的 Express 用户 API,用 MongoDB 替换模拟数组。支持 GET /api/users(查询所有用户)、POST /api/users(存储新用户)。这是一个独立的完整应用,可以运行,并用浏览器、Postman 或前端(第三篇的 Axios)测试数据持久化。

步骤 1: 创建项目文件夹并安装依赖

  • 新建文件夹:mkdir user-api-mongodb
  • 进入:cd user-api-mongodb
  • 初始化:npm init -y
  • 安装依赖:npm install express mongoose

设置 MongoDB

  • 本地:确保 mongod 运行,创建数据库 “userdb”。
  • 或用 Atlas:创建免费集群,获取连接字符串(如 ‘mongodb+srv://user:pass@cluster0.mongodb.net/userdb’)。

步骤 2: 编写服务器代码

新建 server.js 文件,输入以下代码:

const express = require('express');
const mongoose = require('mongoose');
const app = express();
const PORT = 3000;// 中间件:解析 JSON body
app.use(express.json());// 连接 MongoDB(替换为您的连接字符串)
mongoose.connect('mongodb://localhost:27017/userdb', { useNewUrlParser: true, useUnifiedTopology: true }).then(() => console.log('Connected to MongoDB')).catch(err => console.error('MongoDB connection error:', err));// 定义 User 模型
const userSchema = new mongoose.Schema({name: { type: String, required: true },email: { type: String, required: true }
});
const User = mongoose.model('User', userSchema);// GET /api/users:查询所有用户
app.get('/api/users', async (req, res) => {try {const users = await User.find();res.json(users);} catch (err) {res.status(500).json({ error: 'Server error' });}
});// GET /api/users/:id:查询单个用户
app.get('/api/users/:id', async (req, res) => {try {const user = await User.findById(req.params.id);if (user) {res.json(user);} else {res.status(404).json({ error: 'User not found' });}} catch (err) {res.status(500).json({ error: 'Server error' });}
});// POST /api/users:存储新用户
app.post('/api/users', async (req, res) => {try {const newUser = new User({name: req.body.name,email: req.body.email});await newUser.save();res.status(201).json(newUser);} catch (err) {res.status(400).json({ error: 'Invalid data' });}
});// 启动服务器
app.listen(PORT, () => {console.log(`Server running on http://localhost:${PORT}`);
});
  • 解释
    • mongoose.connect:连接数据库(用本地或 Atlas 字符串)。
    • userSchemaUser:定义模型,确保 name/email 必填。
    • GET /api/users:用 find() 查询所有文档,返回 JSON。
    • GET /api/users/:id:用 findById() 查询单个。
    • POST /api/users:创建并 save() 新文档。
    • 异步处理:用 async/await 管理 Promise。
    • 错误处理:捕获异常,返回状态码。

步骤 3: 运行和测试

  • 运行:node server.js(终端显示 “Connected to MongoDB” 和 “Server running”)。
  • 测试 GET:
    • 浏览器访问 http://localhost:3000/api/users,看到空数组(初始)或现有用户。
  • 测试 POST:
    • 用 Postman 发送 POST 到 http://localhost:3000/api/users,body: {“name”: “Alice”, “email”: “alice@example.com”},响应 201 和用户 JSON。
    • 再 GET /api/users,看到持久化数据(重启服务器后仍存在)。
  • 测试单个:POST 后,用 ID 访问 /api/users/。
  • 从前端调用:用第三篇的 Vue 项目,添加 Axios POST/GET 操作用户数据。
  • 这是一个完整的数据库应用!它展示了 MongoDB 如何存储和查询数据。

步骤 4: 扩展(可选)

  • 添加 PUT/DELETE:如 app.put('/api/users/:id') 更新,app.delete 删除。
  • 查询过滤:User.find({ name: 'Alice' })
  • 部署:用环境变量存储连接字符串(dotenv)。

四、常见问题与调试

  • 连接失败?检查 mongod 是否运行,或 Atlas 白名单 IP。
  • Schema 错误?确保模型匹配数据;Mongoose 会验证。
  • 异步问题?用 async/await 或 .then() 处理 Promise。
  • 本地 vs 云?Atlas 更易上手,无需本地安装。

总结

通过本篇,您入门了 MongoDB,并学会了连接数据库实现存储与查询。用户数据存储应用证明了如何将数据库集成到 Express API 中,实现持久化。这是一个独立的完整项目,可以作为用户管理系统的后端基础。

下一篇文章:前后端整合:Vue.js 调用 Express API,操作 MongoDB 数据,实现用户管理系统。我们将结合前文,构建一个完整的 CRUD 应用。如果有疑问,欢迎评论!

(系列导航:这是第6/20篇。关注我,跟着学完整系列!)

http://www.dtcms.com/a/390523.html

相关文章:

  • 【笔记】Docker使用
  • k8s自定义CNI插件实现指南
  • 使用Docker部署Kubernetes(K8s)详解
  • 【Docker】网络
  • 磁共振成像原理(理论)8:射频回波 (RF Echoes)-三脉冲回波(1)
  • 华为云 ELB:智慧负载均衡,让您的应用永葆流畅体验
  • 【实时Linux实战系列】PM QoS 与 C/P-State 管理:功耗与时延的平衡
  • github修改repo名称
  • 使用 C# 操作 Excel 工作表:添加、删除、复制、移动、重命名
  • Python 高效实现 Excel 转 PDF: 不依赖Office
  • Ubuntu25.04通过Docker编译Sunshine记录
  • WebRTC 如何实现的低延迟和高带宽利用率
  • Python接口自动化浅析unittest单元测试原理
  • 【附源码】基于SpringBoot的新能源汽车销售管理系统的设计与实现
  • 虚拟机Ubuntu挂载共享文件夹
  • JS实现房贷计算器和购物车页面
  • 【开题答辩全过程】以 Android安全网购平台为例,包含答辩的问题和答案
  • 期权市场反常信号是什么?
  • 【SpringBoot】26 核心功能 - Web开发原理 - Spring Boot 中定制 Servlet 容器
  • java spring boot 搭建项目
  • 【一文了解】闭包
  • 深入解析Mysql数据库并发:从读写机制到多版本控制
  • Python自学20 - Python操作PDF文件
  • Windows 本地 UV 环境部署 Index-TTS2 实战:基于 EPGF 架构的完整指南(支持 DeepSpeed + FP16)
  • 【cpp Trip第4站】函数参数传递
  • 【Spotfire】实现错行效果
  • 【Day 61】Linux-haproxy负载均衡
  • 搭建线上线下融合的商城小程序,关键步骤有哪些?
  • 软件测试教程资源合集
  • Proteus(8.17)SP2 仿真下载安装过程(附详细安装过程图)