【MongoDB 从入门到实战:安装、配置、CRUD、权限、备份恢复全教程】

前言

MongoDB 是目前最流行的文档型 NoSQL 数据库,以高性能、高可用、易扩展、动态 Schema 著称,广泛用于互联网后端、大数据、日志存储、物联网等场景。本文基于官方标准与生产实践,从零开始讲解 MongoDB 核心概念、Linux 安装、Shell 使用、库 / 集合 / 文档操作、用户权限、备份恢复,并提供高频错误解决方案,适合新手入门与运维参考。


一、MongoDB 基础概念

1.1 什么是 MongoDB

MongoDB 是一个面向文档的分布式数据库,数据以 **BSON(二进制 JSON)** 存储,结构灵活,无需预先定义表结构,支持嵌套文档与数组,非常适合快速迭代的业务系统。

1.2 核心优势

  • 文档存储:类 JSON 格式,易读易维护
  • 动态模式:无需固定表结构
  • 水平扩展:支持分片集群
  • 高可用:副本集自动容灾
  • 丰富索引:提升查询效率
  • 强大查询:支持条件、投影、排序、分页、聚合
  • 大文件存储:GridFS 支持超 16MB 文件
  • 多语言驱动:Java/Python/Go/Node.js/PHP 等

1.3 MongoDB 与 SQL 概念对照(表格版)

表格

SQL 术语 MongoDB 术语 说明
数据库(Database) 数据库(Database) 数据存储容器
表(Table) 集合(Collection) 一组文档
行(Row) 文档(Document) 单条数据
列(Column) 字段(Field) 键值对
主键(Primary Key) _id 自动生成唯一 ID
索引(Index) 索引(Index) 加速查询
表连接(JOIN) $lookup 聚合关联
视图(View) 视图(View) 只读逻辑集合

1.4 核心专业术语

表格

术语 含义
BSON 二进制 JSON,MongoDB 存储格式
ObjectId 文档默认主键
副本集 Replica Set 高可用集群
分片 Sharding 水平扩展
聚合 Aggregation 数据统计分析
TTL 索引 自动过期删除
GridFS 大文件存储
CRUD 增删改查

二、MongoDB Linux 安装(CentOS / RHEL)

2.1 安装依赖

复制代码
dnf install libcurl openssl gcc make perl -y

2.2 解压安装

复制代码
tar -zxvf mongodb-linux-x86_64-rhel8-8.0.8.tgz
mv mongodb-linux-x86_64-rhel8-8.0.8 /usr/local/mongodb

2.3 配置环境变量

复制代码
echo 'export PATH=/usr/local/mongodb/bin:$PATH' >> /etc/profile
source /etc/profile

2.4 创建数据与日志目录

复制代码
mkdir -p /var/lib/mongo
mkdir -p /var/log/mongodb
chown -R mongod:mongod /var/lib/mongo
chown -R mongod:mongod /var/log/mongodb

2.5 安装 OpenSSL 1.1.1(部分版本必需)

复制代码
tar xzf 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

2.6 启动 MongoDB

前台启动(调试)

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

后台守护启动(生产)

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

启动成功提示:

plaintext

复制代码
about to fork child process, waiting until server is ready for connections.
forked process: 12102
child process started successfully, parent exiting

三、MongoDB Shell(mongosh)使用

3.1 安装 mongosh

复制代码
tar xzf 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

3.2 连接 MongoDB

本地连接

复制代码
mongosh

远程连接

复制代码
mongosh --host 192.168.1.10 --port 27017

四、数据库管理

4.1 查看数据库

复制代码
show dbs

4.2 查看当前数据库

复制代码
db

4.3 创建 / 切换数据库

MongoDB 使用 use 自动创建数据库

复制代码
use mydb

4.4 删除数据库

复制代码
db.dropDatabase()

4.5 系统内置数据库

表格

库名 作用
admin 权限管理、超级用户
config 分片集群元数据
local 本地数据,不复制

五、集合(Collection)管理

5.1 查看集合

复制代码
show collections
show tables

5.2 创建普通集合

复制代码
db.createCollection("mycol")

5.3 创建带 JSON Schema 校验的集合(生产常用)

复制代码
db.createCollection("mycol", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "email"],
      properties: {
        name: { bsonType: "string" },
        email: { bsonType: "string", pattern: "^.+@.+$" }
      }
    }
  },
  validationLevel: "strict",
  validationAction: "error"
})

5.4 集合创建参数(表格)

表格

参数 类型 说明
capped bool 是否固定大小集合
size number 集合最大字节
max number 最大文档数
validator object 文档校验规则
validationLevel string 校验严格程度
validationAction string 校验失败处理
storageEngine object 存储引擎配置

5.5 重命名集合

复制代码
db.adminCommand({
  renameCollection: "test.mycol",
  to: "test.mycol_new",
  dropTarget: false
})

5.6 删除集合

复制代码
db.mycol.drop()

六、文档 CRUD 操作(核心)

6.1 插入文档

插入单条

复制代码
db.mycol.insertOne({
  name: "zhangsan",
  age: 20,
  city: "zhengzhou",
  email: "1011@qq.com"
})

插入多条

复制代码
db.mycol.insertMany([
  {name:"zhangsan",age:20,city:"zhengzhou",email:"1011@qq.com"},
  {name:"wangwu",age:26,city:"shanghai",email:"1012@qq.com"}
])

6.2 查询文档

查询所有

复制代码
db.mycol.find()

格式化显示

复制代码
db.mycol.find().pretty()

条件查询

复制代码
db.mycol.find({ age: { $gt: 20 } })

查询单条

复制代码
db.mycol.findOne({ name: "zhangsan" })

投影(指定返回字段)

复制代码
db.mycol.find({},{name:1,age:1,_id:0})

6.3 更新文档

更新单条

复制代码
db.mycol.updateOne(
  { name: "zhangsan" },
  { $set: { age: 21 } }
)

更新多条

复制代码
db.mycol.updateMany(
  { age: { $lt: 30 } },
  { $set: { status: "young" } }
)

替换整个文档

复制代码
db.mycol.replaceOne(
  { name: "lisi" },
  { name: "lisi02", age: 30, city: "zhongguo", email: "1014@qq.com" }
)

6.4 删除文档

删除单条

复制代码
db.mycol.deleteOne({ name: "zhangsan" })

删除多条

复制代码
db.mycol.deleteMany({ age: { $gt: 30 } })

七、MongoDB 常用操作符(表格速查)

7.1 比较操作符

表格

操作符 含义
$eq 等于
$ne 不等于
$gt 大于
$gte 大于等于
$lt 小于
$lte 小于等于
$in 在数组中
$nin 不在数组中

7.2 逻辑操作符

  • $and
  • $or
  • $not
  • $nor

7.3 更新操作符

表格

操作符 作用
$set 更新字段
$unset 删除字段
$inc 数字自增 / 自减
$push 向数组添加元素
$pull 从数组删除元素

八、用户与权限管理

8.1 创建用户

复制代码
use testdb
db.createUser({
  user: "testuser",
  pwd: "password123",
  roles: [
    { role: "readWrite", db: "testdb" },
    { role: "dbAdmin", db: "testdb" }
  ]
})

8.2 常用角色(表格)

表格

角色 权限
read 只读
readWrite 读写
dbAdmin 库管理
userAdmin 用户管理
clusterAdmin 集群管理
root 超级管理员

8.3 带认证启动 MongoDB

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

8.4 认证登录

复制代码
mongosh -u "testuser" -p "password123" --authenticationDatabase "testdb"

8.5 删除用户

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

九、备份与恢复

9.1 安装工具

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

9.2 备份(mongodump)

备份所有库

复制代码
mongodump

备份指定库

复制代码
mongodump -d testdb -o /backup

9.3 恢复(mongorestore)

恢复所有库

复制代码
mongorestore

恢复指定库

复制代码
mongorestore -d testdb /backup/testdb

十、高频错误与解决方案(必看)

10.1 Document failed validation

原因 :缺少 Schema 校验的必填字段(如 name、email)解决 :插入时补全所有 required 字段

10.2 insertOne 传入数组报错

原因insertOne 只能插入单个对象解决 :批量插入用 insertMany

10.3 replaceOne 括号错误(你遇到的问题)

错误写法:

复制代码
db.mycol.replaceOne({name:"lisi"}),{...};

正确写法:

复制代码
db.mycol.replaceOne({name:"lisi"}, {...});

10.4 MongoDB 启动失败 exited with 1

原因 :数据 / 日志目录权限不属于 mongod解决

复制代码
chown -R mongod:mongod /var/lib/mongo
chown -R mongod:mongod /var/log/mongodb

十一、总结

本文完整覆盖 MongoDB 从安装到生产实战全流程:

  • 基础概念与 SQL 对照
  • Linux 环境手动编译安装
  • mongosh 使用
  • 库 / 集合管理
  • CRUD 全套操作
  • 用户权限与安全认证
  • 备份恢复
  • 高频错误解决方案

MongoDB 凭借灵活的文档结构、强大的扩展性和易用性,已成为现代 Web 应用首选数据库之一。掌握本文内容,可直接胜任日常开发、测试、运维工作

相关推荐
難釋懷11 分钟前
Redis网络模型-IO多路复用模型-poll模式
网络·数据库·redis
dFObBIMmai12 分钟前
如何在 CSS 中实现元素的绝对定位,使其不受窗口尺寸变化影响
jvm·数据库·python
treesforest1 小时前
IP精准定位服务:从城市轮廓到街道坐标,技术如何重塑空间感知
网络·数据库·网络协议·tcp/ip·ip
大明者省1 小时前
宝塔开了端口,Ubuntu 还得开相应端口才能打通
服务器·数据库·ubuntu
Teable任意门互动2 小时前
AI原生开源多维表格有哪些?主流开源多维表格对比解析
数据库·开源·excel·钉钉·飞书·开源软件·ai-native
TDengine (老段)2 小时前
MNode 内部机制深度解析 — SDB、事务引擎与 DDL 处理全链路
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
这个DBA有点耶2 小时前
数据库上云 vs 自建:从成本到人力的三维对比与决策框架
数据库·经验分享·sql·创业创新·dba
shizhan_cloud2 小时前
MySQL 索引优化 + 慢查询日志
数据库·mysql
Drache_long2 小时前
MySQL数据库(故障排除)
数据库·mysql
2303_821287382 小时前
如何清洗SQL输入数据_使用框架内置的ORM处理数据交互
jvm·数据库·python