MongoDB 入门到精通是当今最流行的非关系型数据库(NoSQL),以文档存储、灵活结构、高并发、易扩展的特点,成为前端全栈、大数据、Node.js项目的首选数据库。本文系统讲解MongoDB环境搭建、核心概念、10+核心命令、增删改查、高级特性、实战优化,搭配可直接运行的完整代码+新手友好注释,零基础也能快速掌握MongoDB开发技能!

图1:MongoDB 入门到精通 核心知识体系
一、MongoDB 入门到精通:基础概念与环境搭建
学习MongoDB,首先要搞懂核心概念:MongoDB是一款开源文档型数据库,基于BSON(二进制JSON)存储数据,无需固定表结构,支持动态字段,特别适合前端、Node.js、大数据、高并发项目。和传统关系型数据库MySQL相比,MongoDB的学习门槛更低,灵活性和扩展性优势明显,下面用一张表帮你秒懂核心区别:
核心概念(对比MySQL,秒懂)
| 特性 | MongoDB | MySQL |
|---|---|---|
| 数据模型 | 文档型(BSON/JSON),无固定结构 | 表结构(行/列),固定Schema |
| 适用场景 | 高并发、动态数据、大数据、全栈项目 | 结构化数据、事务要求高、传统业务系统 |
| 扩展性 | 天然支持分片集群,横向扩展轻松 | 主从复制为主,横向扩展复杂 |
| 语法风格 | 类JSON语法,开发效率高 | SQL语法,学习成本稍高 |
3种环境搭建方式(新手首选)
# 1. Docker一键安装(企业/开发首选,环境隔离,无环境污染) # --name: 容器名,-p: 端口映射,-e: 初始化root密码,-v: 数据持久化 docker run -d \ --name mongodb \ -p 27017:27017 \ -e MONGO_INITDB_ROOT_USERNAME=admin \ -e MONGO_INITDB_ROOT_PASSWORD=123456 \ -v /data/mongodb:/data/db \ mongo:7.0 # 2. Windows/Linux 本地安装(新手本地开发首选) # 官网下载:https://www.mongodb.com/try/download/community # 安装后默认端口:27017,数据目录:/data/db(Windows为C:\Program Files\MongoDB\Server\7.0\data) # 安装后配置环境变量,即可在命令行使用mongosh # 3. 云数据库MongoDB Atlas(线上项目首选,无需运维) # 官网注册:https://www.mongodb.com/atlas/database,免费版即可满足开发需求 # 连接命令(Atlas集群连接) mongosh "mongodb+srv://集群地址.mongodb.net/" --username admin # 4. 连接MongoDB命令(mongosh,新版官方客户端,必学) mongosh # 本地无密码连接 mongosh -u admin -p 123456 --host 127.0.0.1 --port 27017 # 带账号密码远程连接
基础命令速查(新手第一个命令,必背)
# 查看当前所在数据库
db
# 查看所有数据库(空数据库不显示,需插入数据后才会显示)
show dbs
# 切换/创建数据库(不存在则自动创建,仅在插入数据后持久化,核心命令)
use student_db
# 查看当前数据库下的所有集合
show collections
# 查看MongoDB版本
db.version()
# 查看当前登录用户
db.runCommand({connectionStatus:1})
二、MongoDB 入门到精通:数据库与集合操作
MongoDB最大的优势就是无需提前建库建表,插入数据时自动创建集合和数据库,极大简化新手操作,以下是完整管理命令,带详细注释:
# ------------------- 数据库操作 -------------------
# 1. 创建/切换数据库(核心:use命令=创建+切换,仅插入数据后才会持久化)
use student_db
# 2. 删除当前数据库(谨慎操作!不可逆)
db.dropDatabase()
# ------------------- 集合操作 -------------------
# 1. 创建集合(手动创建,可选,插入数据时自动创建,可配置集合属性)
db.createCollection("student", {
capped: false, # 是否为固定大小集合
size: 1024000, # 集合大小(单位KB,capped为true时生效)
max: 1000 # 集合最大文档数(capped为true时生效)
})
# 2. 查看集合详细信息
db.student.stats()
# 3. 重命名集合
db.student.renameCollection("student_new")
# 4. 删除集合(谨慎操作!不可逆)
db.student.drop()
三、MongoDB 入门到精通:CRUD增删改查(核心命令)
CRUD是MongoDB的核心操作,所有命令基于JSON格式,语法简单易上手,新手直接复制运行,带超详细注释,覆盖企业全场景!
1. C – Create 新增数据
# 切换到学生数据库
use student_db
# 1. 插入单条文档(insertOne:MongoDB 3.2+推荐,返回插入结果)
db.student.insertOne({
name: "张三",
age: 18,
gender: "男",
score: 95,
createTime: new Date(),
tags: ["前端", "Vue"] # 支持数组类型,无需提前定义
})
# 2. 批量插入多条文档(insertMany:企业批量导入数据首选)
db.student.insertMany([
{ name: "李四", age: 19, gender: "女", score: 88, createTime: new Date() },
{ name: "王五", age: 20, gender: "男", score: 92, createTime: new Date() },
{ name: "赵六", age: 18, gender: "女", score: 90, createTime: new Date() }
])
# 3. 插入数据自动生成唯一主键:_id(ObjectId类型,核心特性)
2. R – Read 查询数据(最常用)
# ------------------- 基础查询 -------------------
# 1. 查询集合中所有文档
db.student.find()
# 2. 格式化输出(pretty():易读性更强,新手必加)
db.student.find().pretty()
# 3. 条件查询:查询年龄=18的学生
db.student.find({ age: 18 })
# 4. 投影查询:只返回指定字段(1=显示,0=不显示,_id默认显示)
db.student.find({ age: 18 }, { name: 1, score: 1, _id: 0 })
# ------------------- 高级条件查询 -------------------
# 比较运算符:$gt(大于) | $gte(大于等于) | $lt(小于) | $lte(小于等于) | $ne(不等于)
# 查询年龄大于18的学生
db.student.find({ age: { $gt: 18 } })
# 逻辑运算符:$and(并且,默认) | $or(或者) | $not(取反)
# 多条件并查询(默认AND):年龄18 且 性别男
db.student.find({ age: 18, gender: "男" })
# 多条件或查询($or):年龄18 或 分数90+
db.student.find({ $or: [{ age: 18 }, { score: { $gte: 90 } }] })
# 模糊查询:正则表达式(类似MySQL LIKE,常用)
db.student.find({ name: /张/ }) # 包含"张"的姓名
db.student.find({ name: /^张/ }) # 以"张"开头的姓名(性能更高,推荐)
# 查询数据总条数(countDocuments:MongoDB 4.0+推荐,必学)
db.student.countDocuments()
3. U – Update 修改数据(核心:必须加$set)
# ------------------- 修改数据(必避坑) -------------------
# 1. 修改单条文档(updateOne:仅修改第一条匹配数据,企业常用)
# 核心:必须用$set修改指定字段,否则会直接覆盖整个文档,MongoDB第一大坑!
db.student.updateOne(
{ name: "张三" }, # 查询条件
{ $set: { age: 20, score: 98 } } # 修改内容($set必须加!)
)
# 2. 批量修改(updateMany:修改所有匹配数据)
# $inc:数字自增/自减,给所有女生分数+5
db.student.updateMany(
{ gender: "女" },
{ $inc: { score: 5 } }
)
# 3. 替换整个文档(replaceOne:谨慎使用)
db.student.replaceOne(
{ name: "赵六" },
{ name: "赵六", age: 19, score: 95, gender: "女" }
)
4. D – Delete 删除数据(必谨慎)
# ------------------- 删除数据(不可逆操作) -------------------
# 1. 删除单条文档(deleteOne:仅删除第一条匹配数据)
db.student.deleteOne({ name: "张三" })
# 2. 批量删除(deleteMany:删除所有匹配数据)
# 删除分数小于80的学生
db.student.deleteMany({ score: { $lt: 80 } })
# 3. 清空集合所有数据(谨慎!不可逆)
db.student.deleteMany({})
四、MongoDB 入门到精通:高级特性(企业必备)
掌握排序、分页、聚合、索引、备份恢复,才能胜任企业级MongoDB开发,以下是全场景高级命令,小白直接用!
1. 排序与分页(列表页必备)
# 1. 排序:1=升序,-1=降序 | 按分数降序排序
db.student.find().sort({ score: -1 }).pretty()
# 2. 分页:limit=显示条数,skip=跳过条数(分页公式:skip = (页码-1)*每页条数)
# 第1页:每页2条
db.student.find().limit(2).skip(0)
# 第2页:每页2条
db.student.find().limit(2).skip(2)
# 3. 组合使用:排序+分页(企业标准写法)
db.student.find().sort({ score: -1, _id: 1 }).limit(2).skip(0).pretty()
2. 聚合查询(统计数据核心)
# 按性别统计人数、平均分、总分、最高分(常用统计)
db.student.aggregate([
# 分组条件:_id为分组字段,$gender表示取gender字段的值
{ $group: {
_id: "$gender",
count: { $sum: 1 }, # 统计人数
avgScore: { $avg: "$score" }, # 平均分
totalScore: { $sum: "$score" }, # 总分
maxScore: { $max: "$score" } # 最高分
}},
# 排序:按平均分降序
{ $sort: { avgScore: -1 } }
])
3. 索引(性能优化核心)
# ------------------- 索引操作(必学) -------------------
# 1. 创建单字段索引(姓名索引,提升姓名查询速度,1=升序,-1=降序)
db.student.createIndex({ name: 1 })
# 2. 创建复合索引(多字段索引,遵循最左前缀原则,进阶)
db.student.createIndex({ age: 1, score: -1 })
# 3. 查看集合所有索引
db.student.getIndexes()
# 4. 删除索引(通过索引名删除,索引名=字段名_1)
db.student.dropIndex("name_1")
五、MongoDB 入门到精通:完整实战案例(学生成绩管理)
从零搭建学生管理系统,所有命令可直接运行,零基础跑通完整项目,巩固MongoDB核心知识点!
# 1. 创建数据库
use student_manage
# 2. 插入测试数据
db.student.insertMany([
{ name: "张三", age: 18, gender: "男", score: 95, subject: "数学" },
{ name: "李四", age: 19, gender: "女", score: 88, subject: "语文" },
{ name: "王五", age: 20, gender: "男", score: 92, subject: "英语" },
{ name: "赵六", age: 18, gender: "女", score: 90, subject: "数学" }
])
# 3. 创建索引优化查询
db.student.createIndex({ name: 1 })
db.student.createIndex({ subject: 1 })
# 4. 实战查询:查询数学科目90分以上学生
db.student.find({ subject: "数学", score: { $gte: 90 } }).pretty()
# 5. 实战统计:按科目统计平均分
db.student.aggregate([
{ $group: { _id: "$subject", avgScore: { $avg: "$score" } } }
])
# 6. 实战分页:第1页,每页2条,按分数排序
db.student.find().sort({ score: -1 }).limit(2).skip(0).pretty()

图2:MongoDB 入门到精通 实战命令演示
六、MongoDB 入门到精通:新手避坑指南(100%踩坑点全覆盖)
避坑1:修改数据忘记加 $set
update必须用$set修改指定字段,否则会直接覆盖整个文档,丢失所有原有数据!
避坑2:空数据库不显示
use创建数据库后,必须插入数据,show dbs才会显示,空数据库不会持久化!
避坑3:索引滥用
索引提升查询速度,但会降低插入/修改速度,不要给所有字段加索引!
七、MongoDB 入门到精通:学习路线与总结
通过本文的系统学习,你已经掌握了MongoDB的核心技能,从环境搭建、基础命令、增删改查到高级特性、实战优化,零基础也能轻松上手,胜任企业级MongoDB开发!
- 入门阶段:环境搭建 → 基础命令 → CRUD增删改查 → 条件查询
- 进阶阶段:排序分页 → 聚合查询 → 索引优化 → 事务
- 企业阶段:副本集 → 分片集群 → 数据备份恢复 → 性能调优
-
- 适用场景:前端全栈、Node.js项目、大数据、高并发、动态数据
- 核心优势:无固定结构、语法简单、兼容JSON、易扩展
延伸学习推荐
MongoDB搭配Node.js/Vue3开发全栈项目:
数据库全栈学习、
MongoDB官方文档。
本文为「小白编程笔记」原创 · MongoDB 入门到精通全解

渝公网安备50022402001073号
Pingback: 数据库全栈学习:4篇经典技术专栏全目录 - 小白 编程 笔记
Pingback: 小众数据库全解:15+款不常用数据库分类与选型指南 - 小白 编程 笔记