Mongoose快速上手:数据库安装与CRUD操作指南

作者:暴富20212025.10.13 17:40浏览量:1

简介:本文详细介绍了如何快速安装MongoDB数据库、配置Mongoose并实现增删改查操作,适合Node.js开发者快速入门。

Mongoose快速上手:数据库安装与CRUD操作指南

一、环境准备与数据库安装

1.1 MongoDB安装与启动

MongoDB是Mongoose依赖的NoSQL数据库,支持文档型数据存储。根据操作系统选择安装方式:

  • Windows:从官网下载MSI安装包,安装时勾选”Install MongoDB Compass”可视化工具
  • macOS:使用Homebrew安装brew tap mongodb/brew && brew install mongodb-community
  • Linux:添加官方仓库后sudo apt-get install -y mongodb-org

安装完成后启动服务:

  1. # Windows系统
  2. net start MongoDB
  3. # Linux/macOS系统
  4. sudo service mongod start

验证服务状态:

  1. mongo --eval "db.adminCommand('listDatabases')"

1.2 Node.js项目初始化

创建新项目并安装依赖:

  1. mkdir mongoose-demo && cd mongoose-demo
  2. npm init -y
  3. npm install mongoose express

二、Mongoose基础配置

2.1 连接数据库

db.js中配置连接:

  1. const mongoose = require('mongoose');
  2. async function connectDB() {
  3. try {
  4. await mongoose.connect('mongodb://localhost:27017/demoDB', {
  5. useNewUrlParser: true,
  6. useUnifiedTopology: true
  7. });
  8. console.log('数据库连接成功');
  9. } catch (error) {
  10. console.error('数据库连接失败:', error);
  11. process.exit(1);
  12. }
  13. }
  14. module.exports = connectDB;

2.2 定义数据模型

创建models/User.js定义用户模型:

  1. const mongoose = require('mongoose');
  2. const userSchema = new mongoose.Schema({
  3. username: {
  4. type: String,
  5. required: [true, '用户名不能为空'],
  6. unique: true,
  7. trim: true,
  8. minlength: [3, '用户名至少3个字符']
  9. },
  10. email: {
  11. type: String,
  12. required: true,
  13. validate: {
  14. validator: (v) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v),
  15. message: '请输入有效的邮箱地址'
  16. }
  17. },
  18. age: {
  19. type: Number,
  20. min: [18, '年龄不能小于18岁'],
  21. max: 120
  22. },
  23. createdAt: {
  24. type: Date,
  25. default: Date.now
  26. }
  27. });
  28. module.exports = mongoose.model('User', userSchema);

三、CRUD操作详解

3.1 创建文档(Create)

3.1.1 单个文档创建

  1. const User = require('./models/User');
  2. async function createUser() {
  3. try {
  4. const newUser = new User({
  5. username: 'john_doe',
  6. email: 'john@example.com',
  7. age: 25
  8. });
  9. const savedUser = await newUser.save();
  10. console.log('用户创建成功:', savedUser);
  11. } catch (error) {
  12. console.error('创建用户失败:', error);
  13. }
  14. }

3.1.2 批量插入

  1. async function createMultipleUsers() {
  2. try {
  3. const users = [
  4. { username: 'user1', email: 'user1@example.com', age: 22 },
  5. { username: 'user2', email: 'user2@example.com', age: 28 }
  6. ];
  7. const result = await User.insertMany(users);
  8. console.log('批量创建成功:', result);
  9. } catch (error) {
  10. console.error('批量创建失败:', error);
  11. }
  12. }

3.2 查询文档(Read)

3.2.1 基本查询

  1. async function findUsers() {
  2. try {
  3. // 查询所有用户
  4. const allUsers = await User.find();
  5. console.log('所有用户:', allUsers);
  6. // 条件查询
  7. const specificUser = await User.findOne({ username: 'john_doe' });
  8. console.log('特定用户:', specificUser);
  9. // 分页查询
  10. const paginatedUsers = await User.find()
  11. .skip(10) // 跳过前10条
  12. .limit(5); // 限制返回5条
  13. } catch (error) {
  14. console.error('查询失败:', error);
  15. }
  16. }

3.2.2 高级查询

  1. async function advancedQuery() {
  2. try {
  3. // 条件组合
  4. const result = await User.find({
  5. age: { $gt: 20 }, // 年龄大于20
  6. $or: [ // 或条件
  7. { username: /^john/ }, // 用户名以john开头
  8. { email: /@test\.com$/ } // 邮箱以@test.com结尾
  9. ]
  10. });
  11. // 字段选择
  12. const minimalData = await User.find({}, 'username email');
  13. // 排序
  14. const sortedUsers = await User.find().sort({ age: -1 }); // 年龄降序
  15. } catch (error) {
  16. console.error('高级查询失败:', error);
  17. }
  18. }

3.3 更新文档(Update)

3.3.1 更新单个文档

  1. async function updateUser() {
  2. try {
  3. // 更新第一个匹配的文档
  4. const updated = await User.updateOne(
  5. { username: 'john_doe' },
  6. { $set: { age: 26 } }
  7. );
  8. console.log('更新结果:', updated);
  9. // 更新并返回修改后的文档
  10. const findAndUpdate = await User.findOneAndUpdate(
  11. { username: 'john_doe' },
  12. { $inc: { age: 1 } }, // 年龄+1
  13. { new: true } // 返回更新后的文档
  14. );
  15. } catch (error) {
  16. console.error('更新失败:', error);
  17. }
  18. }

3.3.2 批量更新

  1. async function bulkUpdate() {
  2. try {
  3. const result = await User.updateMany(
  4. { age: { $lt: 25 } }, // 年龄小于25
  5. { $set: { status: 'young' } }
  6. );
  7. console.log('批量更新结果:', result);
  8. } catch (error) {
  9. console.error('批量更新失败:', error);
  10. }
  11. }

3.4 删除文档(Delete)

3.4.1 删除单个文档

  1. async function deleteUser() {
  2. try {
  3. // 删除第一个匹配的文档
  4. const result = await User.deleteOne({ username: 'john_doe' });
  5. console.log('删除结果:', result);
  6. // 查找并删除
  7. const deletedUser = await User.findOneAndDelete({ username: 'user1' });
  8. } catch (error) {
  9. console.error('删除失败:', error);
  10. }
  11. }

3.4.2 批量删除

  1. async function bulkDelete() {
  2. try {
  3. const result = await User.deleteMany({ status: 'young' });
  4. console.log('批量删除结果:', result);
  5. } catch (error) {
  6. console.error('批量删除失败:', error);
  7. }
  8. }

四、最佳实践与注意事项

  1. 连接管理

    • 使用连接池,避免频繁创建/销毁连接
    • 推荐使用mongoose.connection.on('error')监听错误
  2. 错误处理

    • 区分验证错误和数据库错误
    • 使用try/catch处理异步操作
  3. 性能优化

    • 合理使用索引(在Schema中定义)
    • 避免返回不必要的字段
    • 批量操作优于循环单条操作
  4. 安全实践

    • 使用环境变量存储敏感信息
    • 实现输入数据验证
    • 限制查询结果数量防止内存溢出

五、完整示例整合

  1. const express = require('express');
  2. const connectDB = require('./db');
  3. const User = require('./models/User');
  4. const app = express();
  5. app.use(express.json());
  6. // 连接数据库
  7. connectDB();
  8. // 创建用户路由
  9. app.post('/users', async (req, res) => {
  10. try {
  11. const user = new User(req.body);
  12. const savedUser = await user.save();
  13. res.status(201).json(savedUser);
  14. } catch (error) {
  15. res.status(400).json({ error: error.message });
  16. }
  17. });
  18. // 查询用户路由
  19. app.get('/users', async (req, res) => {
  20. try {
  21. const users = await User.find()
  22. .skip(parseInt(req.query.skip || 0))
  23. .limit(parseInt(req.query.limit || 10));
  24. res.json(users);
  25. } catch (error) {
  26. res.status(500).json({ error: error.message });
  27. }
  28. });
  29. const PORT = 3000;
  30. app.listen(PORT, () => {
  31. console.log(`服务器运行在 http://localhost:${PORT}`);
  32. });

六、总结与扩展

通过本文的学习,您已经掌握了:

  1. MongoDB的安装与基本管理
  2. Mongoose的连接配置和模型定义
  3. 完整的CRUD操作实现
  4. 实用的查询技巧和错误处理

建议进一步学习:

  • Mongoose中间件(pre/post hooks)
  • 事务处理
  • 聚合管道查询
  • 人口统计等复杂查询场景

记住,实践是掌握Mongoose的关键。建议从简单的CRUD应用开始,逐步增加复杂度,最终能够熟练处理各种数据库操作场景。