CodeRoad Map 程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。
由 程序员柏风 独立维护 · 关于作者
学习 更多
安装与 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 用 。但团队协作强烈建议统一 Docker。
brew tap mongodb/brew && brew install mongodb-community@7.0
步骤 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"
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 习惯,写进笔记 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 和旧版 mongo shell 什么关系?
旧 mongo shell 已废弃。所有文档与本 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 三级结构是之后所有课的地基。
延伸