【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 的基本使用
- 启动 MongoDB:运行
mongod
(本地)或用 Atlas 获取连接字符串。 - 连接 Node.js:用 Mongoose
mongoose.connect('mongodb://localhost:27017/mydb')
。 - 定义模型:创建 schema(如 UserSchema),然后 model(
mongoose.model('User', UserSchema)
)。 - 操作数据:
- 查询:
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 字符串)。userSchema
和User
:定义模型,确保 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篇。关注我,跟着学完整系列!)