大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
安装与 mongosh
这一课你将能做到
- 用 Docker 在本机启动 MongoDB 7 并用 mongosh 连上,说出
mongod与mongosh的分工 - 执行
show dbs/use/db.runCommand({ ping: 1 }),确认 database → collection → document 三级结构 - 读懂连接字符串
mongodb://...每一段的含义,为后续 Spring / Node 配置打底
为什么要学
文档概念再熟,不上手客户端就只是「听说过」。mongosh 是官方交互式 Shell:试命令、看报错、验证索引、跑聚合,都从这里开始——它之于 MongoDB,就像 mysql 客户端之于 MySQL。
开发环境推荐 Docker,理由与 MySQL 容器化相同:版本钉死、一键启停、不污染系统路径、团队环境一致。本课先跑通「能连上、能读写」;持久化与 compose 编排在 Docker 课展开。
人话:mongod 是服务端进程(真正存数据的),mongosh 是命令行客户端(你敲命令的地方)。两个都要有,缺一不可。
先建立图像
你的电脑
├─ mongosh(客户端,你敲命令)
│ └─ 连接串 → host:27017 → 认证 → 选中库
└─ mongod(服务端,常在 Docker 容器里)
└─ database(coderoadmap_lab)
└─ collection(lesson_logs …)
└─ document({ … })
连接字符串解剖:
mongodb://[username:password@]host[:port][/database][?options]
└── 认证信息 ──┘└─ 地址 ─┘└ 默认库 ┘└ 认证库等选项
示例:
mongodb://admin:secret@127.0.0.1:27017/coderoadmap_lab?authSource=admin
| MongoDB | MySQL | 说明 |
|---|---|---|
| database | database | 逻辑隔离单元 |
| collection | table | 文档的容器 |
| document | row | 一条数据 |
| field | column | 数据项 |
| mongosh | mysql CLI | 命令行客户端 |
| 27017 | 3306 | 默认端口 |
跟着做
步骤 1:用 Docker 启动 MongoDB 7
本机已装 Docker 时执行:
docker run -d --name mongo-dev \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=secret \
mongo:7
应看到:输出容器 ID;docker ps 里有 mongo-dev,端口列显示 0.0.0.0:27017->27017/tcp。
若 27017 被本机其他 mongod 占用,换 -p 27018:27017,之后所有连接串的端口一并改成 27018。
不装 Docker 也可走官方安装包:Windows 用 MSI 安装器(会注册成服务),macOS 用 brew tap mongodb/brew && brew install mongodb-community@7.0。但团队协作强烈建议统一 Docker。
步骤 2:安装并确认 mongosh
- 方式一:按官方文档安装 MongoDB Shell,
mongosh --version应打印版本号 - 方式二:直接进容器里现成的 mongosh:
docker exec -it mongo-dev mongosh -u admin -p secret --authenticationDatabase admin
步骤 3:从宿主机连接并 ping
mongosh "mongodb://admin:secret@127.0.0.1:27017/?authSource=admin"
进入后提示符类似 test>,执行:
db.runCommand({ ping: 1 }) // 应返回 { ok: 1 }
db.getMongo() // 查看当前连接信息
连不上时按顺序排查:容器是否在跑(docker ps)→ 端口是否映射 → 用户名密码是否与启动参数一致 → 是否漏了 authSource=admin。
步骤 4:database 与 collection 初体验
show dbs // 列出已有数据库(空库可能暂不显示)
use coderoadmap_lab // 切换 / 预创建库;首次写入时才真正落盘
db.getCollectionNames() // 当前库集合列表,此刻应为 []
// 插入一条冒烟数据,让库「现身」
db.smoke.insertOne({
ok: true,
note: "安装课冒烟测试",
at: new Date()
})
show dbs // 应出现 coderoadmap_lab
show collections // 应含 smoke
db.smoke.findOne() // 应能看到刚插入的文档,含自动生成的 _id
应看到:插入后库与集合都可见;_id 是一串 ObjectId(...)——没写它,服务器自动生成。
步骤 5:对照 MySQL 习惯,写进笔记
若本机有 MySQL,开两个终端对照敲一遍:
SHOW DATABASES; -- ≈ show dbs
USE codeforge; -- ≈ use coderoadmap_lab
SHOW TABLES; -- ≈ show collections
SELECT * FROM cf_track LIMIT 1; -- ≈ db.tracks.findOne()
注意:Mongo 练习固定用 coderoadmap_lab,绝不写进 MySQL 的 codeforge 生产库。
步骤 6:保存连接串模板
把下面这行写进本地笔记(不要提交密码到 git):
mongodb://admin:secret@127.0.0.1:27017/coderoadmap_lab?authSource=admin
后续 Spring 课与 Node 课会直接复用这段 URI。
讲清楚要点
- mongod 与 mongosh 是两端:「容器在跑」不等于「你已连上」,必须用 URI 或
docker exec进入 shell 验证。 - 空库不会立刻出现在
show dbs:use只是切换上下文,首次写入后库才真正创建——「刚 use 完找不到库」不是故障。 - 开了 root 用户就必须带认证:连接串漏
authSource=admin或密码不对,报Authentication failed。 - 默认端口 27017:与其他服务冲突时改宿主机映射端口,所有客户端 URI 同步改。
- 本课容器未挂载数据卷:删容器即丢数据,先用于连通练习;持久化方案在 Docker 课补齐。
- 本站主库是 MySQL:不要动
spring.datasource.url;Mongo 相关配置走spring.data.mongodb.uri。
你可能会懵的地方
-
use xxx成功了,show dbs却没有 xxx? 尚未写入。插入任意一条文档后再show dbs就能看到——MongoDB 惰性创建库和集合。 -
报 Authentication failed? 逐项检查:用户名密码与
MONGO_INITDB_ROOT_*是否一致;是否带?authSource=admin(root 用户建在 admin 库里);用docker exec方式连可排除 URI 拼写问题。 -
本机已装 MongoDB 服务,又起了 Docker,端口打架? 二选一停掉,或把 Docker 映射到 27018。
netstat -ano | findstr 27017(Windows)可确认占用者。 -
mongosh 和旧版
mongoshell 什么关系? 旧mongoshell 已废弃。所有文档与本 track 一律按 mongosh(基于 Node.js 的官方新 Shell)。 -
db到底指什么? 当前use选中的数据库对象。db.smoke是该库下名为smoke的集合,.insertOne()才是操作。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
docker run 完就以为装好了 | 没验证连通性 | db.runCommand({ ping: 1 }) |
URI 漏 authSource=admin | 认证失败 | 与 INITDB root 配套带上 |
| 练习写入 MySQL 业务库名 | 污染真实数据 | Mongo 固定用 coderoadmap_lab |
把 Mongo URI 填进 spring.datasource.url | Boot 按 MySQL 协议连接直接报错 | 用 spring.data.mongodb.uri |
| 27017 暴露公网且无密码 | 数据任何人可读写 | 本地绑定 + 认证;生产再加网络隔离 |
卡点急救
- 现象:
MongoServerSelectionError: connection refused容器没起或端口没映射。docker ps确认mongo-dev状态 Up 且端口映射存在;不存在就docker start mongo-dev或重建。 - 现象:命令敲进去没反应或提示符不对
确认已在 mongosh 内(提示符是
test>之类),bash 命令(docker、ls)要在 mongosh 外执行,反之亦然。 - 现象:
show dbs里找不到自己的库 库还没写入过。use后随便insertOne一条再show dbs。
面试常问
-
MongoDB 默认端口是多少?如何做认证? 默认 27017。认证方式:连接串带用户名密码 +
authSource指定凭据所在库(root 用户在 admin 库);生产环境还会启用 SCRAM 机制、最小权限角色(如readWrite只授业务库)与网络白名单。 -
mongod 和 mongosh 的区别? mongod 是服务端守护进程,负责存储引擎、索引、副本集选举;mongosh 是官方客户端 Shell,用 JavaScript 语法与服务端交互。一个在容器/服务里跑,一个在你终端里敲。
-
连接字符串里
authSource=admin是什么意思? 指定用哪个库验证这组凭据。MONGO_INITDB_ROOT_USERNAME创建的 root 用户属于 admin 库;若业务用户建在业务库里则authSource应写业务库名。写错会认证失败。
自测三问
- database / collection / document 各对应 MySQL 的什么概念?
- 为什么
use lab之后立刻show dbs可能看不到lab? - 连接字符串由哪几段组成?
authSource的作用是什么?
小结一句话
mongosh 连上 mongod 后,用 use 选库、对 db.集合 做读写;database → collection → document 三级结构是之后所有课的地基。
延伸
- MongoDB 安装文档
- mongosh 官方文档
- 下一课:文档与 BSON——看懂数据到底长什么样。