【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 应用首选数据库之一。掌握本文内容,可直接胜任日常开发、测试、运维工作

相关推荐
weixin_424999362 小时前
如何用SQL按条件计算移动求和_结合CASE与窗口函数
jvm·数据库·python
21439652 小时前
持久化存储如何适配不同浏览器?解决隐私模式下存储失败的指南
jvm·数据库·python
justjinji2 小时前
c++怎么读取大端序设备的固件bin文件_字节反转与位移操作【详解】
jvm·数据库·python
m0_515098422 小时前
如何处理视图中的Definer_视图创建者权限变更对视图有效性的影响
jvm·数据库·python
2401_883600252 小时前
如何创建物化视图_CREATE MATERIALIZED VIEW基本语法与数据填充
jvm·数据库·python
xxjj998a2 小时前
MySQL无法连接到本地localhost的解决办法2024.11.8
数据库·mysql·adb
电商API_180079052472 小时前
京东商品详情接口返回数据说明API调用示例
数据库·性能优化·数据挖掘·数据分析·网络爬虫
Elivs.Xiang2 小时前
Redis - Docker环境下的持久化、主从复制、哨兵、集群、淘汰策略
数据库·redis·docker
绩隐金2 小时前
SQL Server 开发系列(第七期):触发器与约束——数据完整性的守护者
数据库