MongoDB 数据库应用完整手册

本文基于 MongoDB 官方实践与文档规范整理,覆盖核心概念、安装部署、Shell 操作、数据管理、备份恢复、用户权限全流程,包含所有实操命令并补充扩展知识点,可直接用于学习与生产环境部署。

一、基础概念

1. 什么是 MongoDB?

MongoDB 是一个开源、跨平台、面向文档的 NoSQL 数据库,用 C++ 编写,是目前全球最流行的 NoSQL 数据库。

它不使用传统数据库的表 / 行 结构,而是使用集合 (Collection) + 文档 (Document) 存储数据。

2. 是什么类型的数据库?

  • 非关系型数据库(NoSQL)
  • 文档型数据库(Document Database)
  • 分布式、可水平扩展的数据库

3. 核心作用

  • 存储半结构化 / 非结构化数据(JSON/BSON 格式)
  • 支持高并发、大数据量的读写
  • 支持灵活的表结构,随时增删字段
  • 支持分布式集群、高可用
  • 快速开发,无需严格预定义表结构

4. 核心优势

  • 无 Schema 约束,字段可动态增减
  • 内置分片与副本集,支持海量数据扩展
  • 查询语法贴近 JSON,易上手
  • 支持事务、索引、聚合、大文件存储(GridFS)

二、MongoDB 数据结构(和关系型数据库对比)

表格

关系型数据库(MySQL/Oracle) MongoDB
数据库(Database) 数据库(Database)
表(Table) 集合(Collection)
行(Row) 文档(Document)
列(Column) 字段(Field)
主键(Primary Key) 自动生成 _id
外键关联 内嵌文档 / 引用

MongoDB 与传统数据库(如 MySQL)的区别

1. 数据模型不同

  • MySQL:结构化数据,必须先建表、定义字段类型,结构固定
  • MongoDB:文档模型,结构灵活,每个文档字段可不一样,无需预定义

2. 查询语言不同

  • MySQL:SQL 语句
  • MongoDB:基于 JSON 的查询语法

3. 扩展性不同

  • MySQL:主要垂直扩展(升级服务器配置)
  • MongoDB:天然水平扩展(加机器分片)

4. 事务支持

  • MySQL:强事务,支持复杂事务
  • MongoDB:4.0+ 支持多文档事务,满足大多数业务需求

5. 适用数据

  • MySQL:结构化、强关联、强一致性数据
  • MongoDB:半结构化、非结构化、多变结构数据

四、MongoDB 适合的场景(高频面试点)

✅ 最适合

  1. 大数据量、高并发(电商、社交、日志)
  2. 数据结构经常变化(需求频繁改动的项目)
  3. 物联网、设备数据(传感器、日志)
  4. 内容管理、博客、新闻、评论系统
  5. 实时分析、缓存层
  6. 移动端 / 后端快速开发
  7. 分布式应用

❌ 不适合

  1. 强事务、金融核心交易(虽然支持事务但不如 MySQL 成熟)
  2. 大量复杂多表关联查询
  3. 传统 ERP、银行核心系统

五、MongoDB 核心特点(扩展知识点)

1. 数据格式:BSON

  • 二进制 JSON,比 JSON 更快、更小、支持更多类型(日期、二进制、ObjectId)

2. 自动生成主键 _id

  • 无需手动设置主键,MongoDB 自动生成唯一 ID

3. 索引支持

  • 支持单字段索引、复合索引、文本索引、地理空间索引
  • 优化查询速度

4. 强大的查询能力

  • 支持条件、范围、排序、分页、聚合、分组、连接查询
  • 功能接近关系型数据库

5. 分布式架构

  • 分片(Sharding):水平拆分数据,存储海量数据
  • 副本集(Replica Set):主从复制,高可用,自动故障转移

6. schema 灵活(无固定结构)

  • 同一个集合里的文档可以有完全不同的字段
  • 开发效率极高

7. 支持多种语言驱动

  • Java、Python、Node.js、Go、PHP 等几乎所有语言都支持

六、MongoDB 优缺点总结

优点

  • 结构灵活,适合快速迭代开发
  • 读写性能高
  • 水平扩展轻松,支持海量数据
  • 文档模型天然适配程序对象(JSON)
  • 运维简单,集群易用

缺点

  • 占用存储空间比 MySQL 大
  • 事务功能不如关系型数据库成熟
  • 复杂关联查询效率一般
  • 不适合超复杂的 SQL 统计查询

八、MongoDB 典型应用公司

  • 腾讯、阿里、百度、京东
  • 字节跳动、美团、小米
  • Twitter、Facebook、Google
  • 游戏、直播、电商、物联网平台大量使用

总结(最核心必背)

  1. MongoDB = 文档型 NoSQL 数据库
  2. 结构:库 → 集合 → 文档(JSON/BSON)
  3. 最大优势:灵活、高性能、易扩展
  4. 适合:数据量大、结构多变、高并发场景
  5. 与 MySQL 区别:schema 灵活、分布式友好、无强表结构
  6. 核心组件:副本集(高可用)、分片(水平扩展)、索引(查询快)

二、Linux 环境安装部署

1. 依赖安装

bash

运行

复制代码
# 安装基础依赖
dnf install libcurl openssl gcc make perl -y

2. 安装 OpenSSL 1.1.1

bash

运行

复制代码
# 解压源码包
tar -zxvf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w

# 编译配置
./config --prefix=/opt/openssl11 --openssldir=/opt/openssl11/ssl

# 编译安装
make -j$(nproc)
make install

# 配置环境变量
echo 'export LD_LIBRARY_PATH=/opt/openssl11/lib:$LD_LIBRARY_PATH' >> /etc/profile.d/openssl11.sh
source /etc/profile.d/openssl11.sh

3. 安装 MongoDB 服务端

bash

运行

复制代码
# 解压安装包
tar -zxvf mongodb-linux-x86_64-rhel8-8.0.8.tgz

# 移动到指定目录
mv mongodb-linux-x86_64-rhel8-8.0.8 /usr/local/mongodb

# 配置PATH环境变量
echo 'export PATH=/usr/local/mongodb/bin:$PATH' >> /etc/profile
source /etc/profile

4. 创建数据与日志目录

bash

运行

复制代码
# 创建目录
mkdir -p /var/lib/mongo
mkdir -p /var/log/mongodb

# 授权
chown `whoami` /var/lib/mongo
chown `whoami` /var/log/mongodb

5. 启动 MongoDB

bash

运行

复制代码
mongod --dbpath /var/lib/mongo \
--logpath /var/log/mongodb/mongod.log \
--bind_ip_all \
--fork

补充知识点

  • --bind_ip_all:允许所有 IP 访问,生产环境建议指定具体 IP
  • --fork:后台守护进程运行
  • 默认端口:27017

三、MongoDB Shell(mongosh)安装与使用

1. 安装 Shell 工具

bash

运行

复制代码
tar -zxvf mongosh-2.5.0-linux-x64-openssl3.tgz
cd mongosh-2.5.0-linux-x64-openssl3/bin

cp mongosh /usr/local/bin
cp mongosh_crypt_v1.so /usr/local/lib/

2. 连接 MongoDB

bash

运行

复制代码
# 本地默认连接
mongosh

# 远程连接
mongosh --host 127.0.0.1 --port 27017

四、数据库管理操作

1. 查看数据库

bash

运行

复制代码
# 查看所有数据库
show dbs

# 查看当前数据库
db

2. 创建 / 切换数据库

bash

运行

复制代码
# 不存在则创建,存在则切换
use mydb

补充知识点

  • 数据库仅插入数据后才会被持久化显示

3. 删除数据库

bash

运行

复制代码
use mydb
db.dropDatabase()

4. 系统内置库说明

  • admin:全局权限、用户管理
  • config:分片集群元数据
  • local:本地副本集日志,不参与同步

五、集合(Collection)管理

1. 查看集合

bash

运行

复制代码
show collections
# 或
show tables

2. 创建集合

bash

运行

复制代码
# 基础创建
db.createCollection("user")

# 高级创建(固定大小+数据验证)
db.createCollection("user_info", {
  capped: true,
  size: 10485760,
  max: 5000,
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "phone"],
      properties: {
        name: { bsonType: "string" },
        phone: { bsonType: "string" }
      }
    }
  },
  validationLevel: "strict"
})

补充知识点

  • capped:true:固定容量集合,满后自动覆盖旧数据
  • validator:文档数据校验,保证数据规范

3. 重命名集合

bash

运行

复制代码
db.adminCommand({
  renameCollection: "mydb.old_col",
  to: "mydb.new_col",
  dropTarget: false
})

4. 删除集合

bash

运行

复制代码
db.user.drop()

六、文档(Document)CRUD 操作

1. 插入文档

bash

运行

复制代码
# 单条插入
db.user.insertOne({
  name: "张三",
  age: 22,
  city: "郑州"
})

# 批量插入
db.user.insertMany([
  { name: "李四", age: 25, city: "北京" },
  { name: "王五", age: 30, city: "上海" }
])

补充知识点

  • 无集合时自动创建集合
  • _id:自动生成唯一主键

2. 查询文档

bash

运行

复制代码
# 查询所有
db.user.find()

# 格式化显示
db.user.find().pretty()

# 条件查询(年龄>25)
db.user.find({ age: { $gt: 25 } })

# 指定字段返回(排除_id)
db.user.find(
  { age: { $gt: 25 } },
  { name: 1, age: 1, _id: 0 }
)

# 查询单条
db.user.findOne({ name: "张三" })

常用查询操作符

  • $gt:大于
  • $lt:小于
  • $gte:大于等于
  • $lte:小于等于
  • $ne:不等于

3. 更新文档

bash

运行

复制代码
# 更新单条
db.user.updateOne(
  { name: "张三" },
  { $set: { age: 23 } }
)

# 更新多条
db.user.updateMany(
  { age: { $lt: 30 } },
  { $set: { status: "active" } }
)

# 替换文档
db.user.replaceOne(
  { name: "李四" },
  { name: "李四", age: 26, city: "深圳" }
)

# 查找并返回更新后文档
db.user.findOneAndUpdate(
  { name: "王五" },
  { $set: { age: 31 } },
  { returnDocument: "after" }
)

补充知识点

  • $set:只更新指定字段,不覆盖整个文档
  • upsert:true:无匹配数据则自动插入

4. 删除文档

bash

运行

复制代码
# 删除单条
db.user.deleteOne({ name: "张三" })

# 删除多条
db.user.deleteMany({ age: { $gt: 30 } })

# 查找并删除
db.user.findOneAndDelete({ name: "李四" })

七、备份与恢复(mongodump/mongorestore)

1. 安装工具

bash

运行

复制代码
rpm -ivh mongodb-database-tools-rhel70-x86_64-100.12.0.rpm

2. 数据备份

bash

运行

复制代码
# 全量备份
mongodump -h 127.0.0.1:27017 -o /data/backup/

# 单库备份
mongodump -d mydb -o /data/backup/

# 单集合备份
mongodump -d mydb -c user -o /data/backup/

3. 数据恢复

bash

运行

复制代码
# 全量恢复
mongorestore /data/backup/

# 单库恢复
mongorestore -d mydb /data/backup/mydb

# 恢复前清空数据(慎用)
mongorestore -d mydb --drop /data/backup/mydb

八、用户与权限管理

1. 创建用户

bash

运行

复制代码
use mydb
db.createUser({
  user: "db_admin",
  pwd: "Admin@123",
  roles: [
    { role: "readWrite", db: "mydb" },
    { role: "dbAdmin", db: "mydb" }
  ]
})

2. 用户认证

bash

运行

复制代码
db.auth("db_admin", "Admin@123")

3. 启用身份验证

bash

运行

复制代码
# 启动时添加认证参数
mongod --auth --dbpath /var/lib/mongo \
--logpath /var/log/mongodb/mongod.log \
--bind_ip_all --fork

4. 认证连接

bash

运行

复制代码
mongosh -u "db_admin" -p "Admin@123" \
--authenticationDatabase "mydb"

5. 删除用户

bash

运行

复制代码
db.dropUser("db_admin")

常用角色

  • read:只读
  • readWrite:读写
  • dbAdmin:库管理
  • root:超级管理员

九、补充核心知识点

  1. ObjectId:12 字节唯一标识,包含时间戳、机器 ID、进程 ID、计数器
  2. 索引:支持单字段、复合、多键、地理空间索引,提升查询速度
  3. 副本集:一主多从,自动故障转移,保证高可用
  4. 分片:水平拆分数据,分散存储到多个节点,支撑亿级数据
  5. 事务:4.0 + 支持多文档事务,保证 ACID 特性
  6. GridFS:存储 > 16MB 大文件(图片、视频)
  7. 聚合框架$match$group$sort等,实现复杂数据分析

十、生产环境最佳实践

  • 启用身份验证,禁止裸奔运行
  • 使用 XFS 文件系统,搭配 WiredTiger 存储引擎
  • 合理创建索引,避免全表扫描
  • 定期备份数据,防止丢失
  • 副本集 + 分片架构保证高可用与扩展性
相关推荐
踩着两条虫2 小时前
VTJ.PRO 新手入门:从环境搭建到 AI 生成首个 Vue3 应用
前端·javascript·数据库·vue.js·人工智能·低代码
响叮当!2 小时前
Milvus 向量数据库使用指南
数据库·milvus
吕源林2 小时前
CSS如何使用Bootstrap网格嵌套布局_在栅格内创建内部行
jvm·数据库·python
Polar__Star2 小时前
php怎么调用OPPO AI图像超分_php如何将低分辨率图放大不失真
jvm·数据库·python
Yushan Bai2 小时前
ORACLE报错ORA-04030 koh-kghu sessi,pmucalm coll的分析处理步骤
数据库·oracle
m0_678485452 小时前
CSS如何让文字超出两行显示省略号_使用line-clamp属性限制
jvm·数据库·python
gmaajt2 小时前
SQL如何统计每个类别的订单总额_使用SUM与GROUP BY聚合分析
jvm·数据库·python
山河梧念2 小时前
【保姆级教程】VMware虚拟机安装全流程
android·java·数据库
志栋智能2 小时前
运维超自动化的本质:效率、质量与创新的三重奏
运维·服务器·数据库·安全·自动化