【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 文件,输入以下代码:

javascript 复制代码
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:
  • 测试 POST:
  • 测试单个: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篇。关注我,跟着学完整系列!)

相关推荐
点灯小铭3 小时前
基于51单片机水塔水箱液水位WIFI监控报警设计
单片机·嵌入式硬件·mongodb·毕业设计·51单片机·课程设计
喜欢你,还有大家3 小时前
MySQL高级语法
数据库·mysql
IvorySQL3 小时前
直播预告| PostgreSQL 与 IvorySQL 在云原生时代的演进与实践
数据库·postgresql·ivorysql
LeicyII3 小时前
6.MySQL索引的数据结构【面试题】
数据结构·数据库·mysql
大筒木老辈子3 小时前
MySQL笔记---数据库基础
数据库·笔记·mysql
Yan-英杰4 小时前
Amazon SES + NestJS 实战:零成本打造高送达率邮箱验证方案
java·服务器·前端·网络·数据库·ai
深蓝电商API4 小时前
爬虫数据存储:MongoDB 在电商采集中的应用
数据库·爬虫·mongodb
弹简特4 小时前
【MySQL初阶】04-数据表的操作
数据库·mysql
一个天蝎座 白勺 程序猿4 小时前
Apache IoTDB(6):深入解析数据库管理操作——增删改查与异构数据库实战指南
数据库·apache·时序数据库·数据库管理·iotdb