MongoDB: 环境搭建与mongosh:MongoDB开发环境全配置
最后更新:2026-08-26
mongosh 是 MongoDB 官方的命令行客户端——它是你与 MongoDB 交互的最直接工具。
本教程面向零基础开发者,从本地安装到 Atlas 连接,从 mongosh 基础命令到第一个 ping 测试。
1. 你将学到
- 在 Windows / macOS / Linux 上安装 MongoDB 社区版
- 使用 Docker 快速部署 MongoDB 容器
- 创建 MongoDB Atlas 免费云集群
- mongosh 命令行客户端的核心用法
- VSCode MongoDB 插件配置
- 第一个数据库连接测试(
db.runCommand({ ping: 1 })) - 常见安装问题排查
2. 一个全栈工程师的真实故事
(1) 痛点:新电脑从零配置 MongoDB 环境
Bob 刚换了 MacBook Pro M3,他要在一台全新的机器上搭建 MongoDB 开发环境:
"我要在 30 分钟内让 Node.js 代码连接上 MongoDB,并跑通第一个 CRUD。但我之前用 Windows,现在换了 M3 芯片的 ARM Mac,搜的教程都不适用。"
他尝试了 3 个方案都失败:
| 方案 | 问题 |
|---|---|
| ❌ brew install mongodb | M3 ARM 架构无 homebrew/core 官方 formula |
| ❌ 下载 .dmg 安装包 | 提示"无法打开,因为开发者无法验证" |
| ❌ 从 MongoDB 下载页 | 找不到 macOS ARM 版本 |
(2) MongoDB + Docker 的解法
用 Docker 跳过所有本地编译问题。
# 1. 安装 Docker Desktop for Mac (Apple Silicon)
# 从 https://www.docker.com/products/docker-desktop/ 下载
# 2. 拉取 MongoDB 镜像
docker pull mongo:7.0
# 3. 启动 MongoDB 容器(端口映射 + 数据卷)
docker run -d \
--name mongodb-dev \
-p 27017:27017 \
-v ~/mongodb-data:/data/db \
mongo:7.0
# 4. 用 mongosh 连接
mongosh "mongodb://localhost:27017/admin"
# 5. 测试连接
db.runCommand({ ping: 1 })
# { ok: 1 }
(3) 收益
| 维度 | 原生安装 | Docker 安装 |
|---|---|---|
| 跨平台 | ❌ 各平台不同 | ✅ 一次构建,到处运行 |
| 多版本共存 | ❌ 难 | ✅ 启动多个容器 |
| 卸载干净 | ❌ 残留配置 | ✅ 删容器即可 |
| 团队一致 | ⚠️ 依赖 OS 版本 | ✅ 镜像锁定版本 |
| 启动时间 | 1-3 分钟 | 5-10 秒 |
3. 安装方式对比
概念说明:MongoDB 提供四种安装方式——Docker 容器、Atlas 云服务、原生安装(brew/apt/msi)、包管理器。选择哪种方式取决于你的使用场景:开发环境推荐 Docker(跨平台、隔离、快速),团队协作推荐 Atlas(免运维、全球部署),生产环境推荐原生安装(性能最好)。
工作原理:Docker 容器通过 Linux 命名空间隔离 MongoDB 进程,数据通过卷挂载持久化到宿主机。Atlas 云服务在 AWS/Azure/GCP 上自动部署副本集,提供自动备份和监控。原生安装直接运行 mongod 进程,性能最优但需要手动管理。
graph TB
A[MongoDB 安装方式] --> B[原生安装<br/>brew/apt/dmg/exe]
A --> C[Docker 容器<br/>推荐快速开发]
A --> D[Atlas 云服务<br/>零本地配置]
A --> E[包管理器<br/>Homebrew/Chocolatey]
style C fill:#d4edda
style D fill:#d4edda
| 方式 | 适用 | 难度 | 推荐场景 | 性能 |
|---|---|---|---|---|
| Docker | 跨平台 | ⭐ | ⭐⭐⭐ 快速开发 | ⚠️ 略有损耗 |
| Atlas | 云服务 | ⭐⭐ | ⭐⭐⭐ 团队协作 | ✅ 托管优化 |
| brew/apt 原生 | 单平台 | ⭐⭐ | ⭐⭐ 生产环境 | ✅ 最佳 |
| 官方 .dmg/.exe | 图形化 | ⭐⭐⭐ | ⭐ 一次性使用 | ✅ 最佳 |
(1) 四种安装方式
graph TB
A[MongoDB 安装方式] --> B[原生安装<br/>brew/apt/dmg/exe]
A --> C[Docker 容器<br/>推荐快速开发]
A --> D[Atlas 云服务<br/>零本地配置]
A --> E[包管理器<br/>Homebrew/Chocolatey]
style C fill:#d4edda
style D fill:#d4edda
| 方式 | 适用 | 难度 | 推荐场景 |
|---|---|---|---|
| Docker | 跨平台 | ⭐ | ⭐⭐⭐ 快速开发 |
| Atlas | 云服务 | ⭐⭐ | ⭐⭐⭐ 团队协作 |
| brew/apt 原生 | 单平台 | ⭐⭐ | ⭐⭐ 生产环境 |
| 官方 .dmg/.exe | 图形化 | ⭐⭐⭐ | ⭐ 一次性使用 |
(2) MongoDB 版本选择
概念说明:MongoDB 采用 LTS(长期支持)版本策略,每个大版本维护 3-5 年。选择版本时应优先考虑 LTS 版本而非最新版本——LTS 版本经过充分测试且有长期安全更新保证。
| 版本 | 发布日期 | 状态 | 推荐场景 |
|---|---|---|---|
| MongoDB 8.0 | 2024 | 最新 LTS 候选 | 新项目 |
| MongoDB 7.0 | 2023 | 当前 LTS | 本教程使用 |
| MongoDB 6.0 | 2022 | 上一个 LTS | 兼容性优先 |
| MongoDB 5.0 | 2021 | EOL 接近 | 不推荐 |
▶ 示例 1:版本检查命令
# 检查 mongosh 版本
mongosh --version
# mongosh 2.1.0
# 检查 mongod 服务端版本
mongod --version
# db version v7.0.5
# 通过 mongosh 检查服务端版本
mongosh "mongodb://localhost:27017" --eval "db.version()"
# 7.0.5
输出:
test> // MongoDB shell 操作成功
4. Docker 方式安装(推荐)
概念说明:Docker 是最推荐的 MongoDB 开发环境安装方式。Docker 将 MongoDB 及其依赖打包在容器中,隔离于宿主机的文件系统和网络,实现"一次构建,到处运行"。相比原生安装,Docker 的优势是:跨平台一致、多版本共存、卸载干净、启动极快(5-10秒)。
工作原理:Docker 容器本质是 Linux 进程的隔离运行环境。MongoDB 容器使用官方镜像(mongo:7.0),内部运行 mongod 进程。通过端口映射(-p 27017:27017)将容器内端口暴露给宿主机,通过卷挂载(-v ~/mongodb-data:/data/db)将数据持久化到宿主机——容器删除后数据不丢失。
graph LR
A[宿主机] --> B[Docker Engine]
B --> C[mongodb-dev 容器]
C --> D[mongod 进程<br/>端口 27017]
A --> E[~/mongodb-data<br/>数据卷挂载]
E --> D
A --> F[mongosh 客户端<br/>连接 localhost:27017]
F --> D
style C fill:#d4edda
(1) 4.1 前置条件
# 安装 Docker Desktop
# macOS: 下载 https://www.docker.com/products/docker-desktop/
# Windows: 下载 + 启用 WSL 2 后端
# Linux: sudo apt install docker.io docker-compose
# 验证 Docker 安装
docker --version
# Docker version 24.0.7, build afdd53b
(2) 4.2 拉取 MongoDB 镜像
# 拉取最新稳定版
docker pull mongo:7.0
# 拉取特定版本(推荐)
docker pull mongo:7.0.5
# 拉取带认证的镜像(生产环境推荐)
docker pull mongo:7.0-auth
(3) 4.3 启动 MongoDB 容器
# 单机开发模式(无认证)
docker run -d \
--name mongodb-dev \
-p 27017:27017 \
-v ~/mongodb-data:/data/db \
--restart unless-stopped \
mongo:7.0
# 带认证的生产模式
docker run -d \
--name mongodb-prod \
-p 27017:27017 \
-v ~/mongodb-data:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=YourSecurePass123 \
--restart unless-stopped \
mongo:7.0
# 验证容器运行状态
docker ps
# CONTAINER ID IMAGE STATUS PORTS
# a1b2c3d4e5f6 mongo:7.0 Up 2 minutes 0.0.0.0:27017->27017/tcp
(4) 4.4 验证连接
# 用 mongosh 连接
mongosh "mongodb://localhost:27017"
# 在 mongosh 内执行
db.runCommand({ ping: 1 })
# { ok: 1 }
(5) 4.5 常用 Docker 命令
# 查看容器日志
docker logs mongodb-dev
# 停止容器
docker stop mongodb-dev
# 启动容器
docker start mongodb-dev
# 重启容器
docker restart mongodb-dev
# 进入容器内部
docker exec -it mongodb-dev mongosh
# 删除容器(数据卷保留)
docker rm mongodb-dev
# 删除容器和数据卷(慎用!数据丢失)
docker rm -v mongodb-dev
5. macOS 原生安装
(1) 5.1 Homebrew 安装
# 添加 MongoDB 官方 Tap
brew tap mongodb/brew
# 安装最新稳定版
brew install mongodb-community@7.0
# 启动 MongoDB 服务
brew services start mongodb-community@7.0
# 验证
mongosh --version
mongosh "mongodb://localhost:27017" --eval "db.runCommand({ ping: 1 })"
(2) 5.2 手动启动(不通过 brew services)
# 启动 mongod(指定数据目录和日志文件)
mongod --dbpath ~/mongodb-data --logpath ~/mongodb.log --fork
# 验证
ps aux | grep mongod
# mongodb 12345 ... mongod --dbpath /Users/.../mongodb-data
▶ 示例 2:完整 macOS 安装流程
# === 1. 安装 Xcode Command Line Tools ===
xcode-select --install
# === 2. 安装 Homebrew(如果还没有) ===
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# === 3. 添加 MongoDB Tap ===
brew tap mongodb/brew
# === 4. 安装 MongoDB ===
brew install mongodb-community@7.0
# === 5. 启动服务 ===
brew services start mongodb-community@7.0
# === 6. 连接测试 ===
mongosh "mongodb://localhost:27017"
# === 7. 第一个命令 ===
db.runCommand({ ping: 1 })
# { ok: 1 }
输出:
test> // MongoDB shell 操作成功
6. Linux 安装
(1) Ubuntu / Debian
# 1. 导入 MongoDB GPG 密钥
wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add -
# 2. 添加 MongoDB 源
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
# 3. 更新包索引
sudo apt update
# 4. 安装 MongoDB
sudo apt install -y mongodb-org
# 5. 启动服务
sudo systemctl start mongod
sudo systemctl enable mongod
# 6. 验证
sudo systemctl status mongod
mongosh --eval "db.runCommand({ ping: 1 })"
(2) CentOS / RHEL / Fedora
# 1. 添加 MongoDB Yum 源
sudo tee /etc/yum.repos.d/mongodb-org-7.0.repo << 'EOF'
[mongodb-org-7.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/7.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-7.0.asc
EOF
# 2. 安装
sudo yum install -y mongodb-org
# 3. 启动
sudo systemctl start mongod
sudo systemctl enable mongod
7. Windows 安装
(1) 7.1 MSI 安装包(图形化)
1. 访问 https://www.mongodb.com/try/download/community
2. 选择 "Windows" + "msi" + 版本 7.0
3. 下载 MongoDB-windows-x86_64-7.0.x-signed.msi
4. 双击安装:
✅ Complete 安装类型
✅ Install MongoDB as a Service
✅ Install MongoDB Compass(GUI 工具)
5. 完成安装后,MongoDB 自动作为 Windows 服务启动
(2) 7.2 Chocolatey 安装
# 1. 安装 Chocolatey(如果还没有)
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# 2. 安装 MongoDB
choco install mongodb
# 3. 启动
mongod --dbpath C:\data\db
# 4. 连接
mongosh "mongodb://localhost:27017"
▶ 示例 3:Windows 完整安装流程
# === 1. 创建数据目录 ===
mkdir C:\data\db
# === 2. 启动 MongoDB ===
mongod --dbpath C:\data\db
# === 3. 另一个终端连接 ===
mongosh "mongodb://localhost:27017"
# === 4. 测试 ===
db.runCommand({ ping: 1 })
# { ok: 1 }
输出:
// 执行成功
8. MongoDB Atlas 云服务配置
概念说明:MongoDB Atlas 是官方全托管云数据库服务,覆盖 AWS/Azure/GCP 三大云平台。对于团队协作和跨国部署场景,Atlas 是最佳选择——免运维、自动备份、全球部署、内置监控。Atlas 提供 512 MB 永久免费层(M0 Sandbox),足够学习和小型项目使用。
工作原理:Atlas 在云平台上自动部署 3 节点副本集,Primary 处理写入请求,两个 Secondary 提供读取冗余和自动故障转移。用户通过 Atlas Web 控制台管理集群、配置网络白名单、创建数据库用户。连接字符串支持 mongodb+srv:// 格式,通过 DNS SRV 记录自动发现集群节点。
graph LR
A[你的应用] --> B[Atlas 全球集群<br/>3 节点副本集]
B --> C[Primary<br/>读写]
B --> D[Secondary 1<br/>读冗余]
B --> E[Secondary 2<br/>读冗余]
B --> F[自动备份<br/>PITR]
B --> G[监控告警<br/>性能建议]
style B fill:#d4edda
(1) 8.1 创建免费集群
1. 访问 https://www.mongodb.com/cloud/atlas/register
2. 注册账号(Google / GitHub OAuth 最快)
3. 选择 "Build a Cluster" → "Shared" → "M0 Sandbox"(免费)
4. 云提供商:AWS(推荐)
5. 区域:
- 中东用户:me-central-1 (UAE)
- 巴西用户:sa-east-1 (São Paulo)
- 日本用户:ap-northeast-1 (Tokyo)
6. 集群名称:Cluster0
7. 点击 "Create Cluster"(等待 1-3 分钟)
(2) 8.2 配置访问权限
步骤 1:创建数据库用户
- Database Access → Add New Database User
- Username: alice
- Password: YourSecurePass123
- Database User Privileges: Read and write to any database
步骤 2:配置网络白名单
- Network Access → Add IP Address
- 选择 "Allow Access from Anywhere"(0.0.0.0/0)
⚠️ 仅开发用,生产环境应限制为应用服务器 IP
(3) 8.3 获取连接字符串
1. Database → Connect → Connect your application
2. Driver: Node.js
3. Version: 5.5 or later
4. 连接字符串:
mongodb+srv://alice:YourSecurePass123@cluster0.mongodb.net/mydb?retryWrites=true&w=majority
▶ 示例 4:连接 Atlas 集群
# 用 mongosh 连接 Atlas
mongosh "mongodb+srv://cluster0.mongodb.net/mydb" --username alice
# Password: ********
# 在 mongosh 内执行
db.runCommand({ ping: 1 })
# { ok: 1 }
# 插入第一个文档
db.users.insertOne({ name: "Alice", email: "alice@example.com" })
# 查询
db.users.find()
# { _id: ObjectId('...'), name: 'Alice', email: 'alice@example.com' }
输出:
test> // MongoDB shell 操作成功
9. mongosh 命令行客户端
概念说明:mongosh 是 MongoDB 官方命令行客户端(2020 年后替代旧的 mongo shell),基于 Node.js 运行,支持现代 JavaScript 语法、语法高亮、自动补全和错误堆栈。mongosh 是与 MongoDB 交互最直接的工具——所有数据库操作都可以通过 mongosh 执行。
工作原理:mongosh 通过 MongoDB Wire Protocol 与 mongod 服务端通信。默认连接本地 27017 端口,也支持 Atlas 连接字符串和 TLS 加密连接。mongosh 内置了 db 对象(当前数据库)和全局方法(show dbs、use 等),所有操作都通过 JavaScript 语法执行。
graph LR
A[mongosh 客户端] --> B[Wire Protocol]
B --> C[mongod 服务端]
C --> D[WiredTiger 引擎]
A --> A1[JavaScript 运行时]
A --> A2[自动补全]
A --> A3[语法高亮]
style A fill:#cce5ff
| 命令类别 | 常用命令 | 说明 |
|---|---|---|
| 数据库 | show dbs / use db / db.dropDatabase() |
查看切换删除 |
| 集合 | show collections / db.createCollection() / db.col.drop() |
创建查看删除 |
| 文档 | insertOne/find/updateOne/deleteOne |
CRUD 操作 |
| 帮助 | help / db.help() / db.col.help() |
内置文档 |
(1) 启动 mongosh
# 连接本地默认端口
mongosh
# 连接指定主机和端口
mongosh "mongodb://localhost:27017"
# 连接 Atlas
mongosh "mongodb+srv://cluster0.mongodb.net/mydb" --username alice
# 连接并执行单条命令
mongosh "mongodb://localhost:27017" --eval "db.runCommand({ ping: 1 })"
# 启用 verbose 模式(查看每个命令的耗时)
mongosh --verbose
(2) mongosh 基础命令
// === 数据库操作 ===
show dbs // 列出所有数据库
use shopdb // 切换到 shopdb 数据库(不存在则隐式创建)
db // 显示当前数据库
db.dropDatabase() // 删除当前数据库
// === 集合操作 ===
show collections // 列出当前数据库的所有集合
db.createCollection("products") // 显式创建集合
db.products.drop() // 删除集合
// === 文档操作 ===
db.products.insertOne({ sku: "PHONE-001", price: 599.99 })
db.products.find() // 查询所有文档
db.products.find().pretty() // 格式化输出
db.products.countDocuments() // 统计文档数
// === 帮助命令 ===
help // mongosh 内置帮助
db.help() // 数据库命令帮助
db.products.help() // 集合操作帮助
(3) mongosh 快捷键
| 快捷键 | 功能 |
|---|---|
↑ / ↓ |
浏览历史命令 |
Tab |
自动补全 |
Ctrl + A |
跳到行首 |
Ctrl + E |
跳到行尾 |
Ctrl + U |
删除整行 |
Ctrl + L |
清屏 |
Ctrl + C |
中断当前命令 |
Ctrl + D / exit |
退出 mongosh |
▶ 示例 5:mongosh 脚本文件
# === 编写脚本(setup-mongosh.js) ===
cat > setup-mongosh.js << 'EOF'
// 切换到 shopdb
use shopdb;
// 创建用户集合
db.users.insertMany([
{ name: "Alice", email: "alice@example.com", age: 28 },
{ name: "Bob", email: "bob@example.com", age: 32 },
{ name: "Charlie", email: "charlie@example.com", age: 25 }
]);
// 创建产品集合
db.products.insertMany([
{ sku: "PHONE-001", title: "Phone X", price: 599.99, stock: 50 },
{ sku: "LAPTOP-001", title: "Laptop Y", price: 1299.99, stock: 20 }
]);
// 查询所有用户
print("Users:");
db.users.find().forEach(printjson);
// 查询所有产品
print("Products:");
db.products.find().forEach(printjson);
EOF
# === 执行脚本 ===
mongosh "mongodb://localhost:27017" setup-mongosh.js
输出:
test> // MongoDB shell 操作成功
10. VSCode MongoDB 插件
(1) 10.1 安装插件
1. 打开 VSCode
2. Extensions (Ctrl+Shift+X)
3. 搜索 "MongoDB for VS Code"
4. 点击 Install(官方插件,由 MongoDB Inc. 提供)
(2) 10.2 连接数据库
1. 点击侧边栏 MongoDB 图标
2. 点击 "Add Connection"
3. 输入连接字符串:
- 本地:mongodb://localhost:27017
- Atlas:mongodb+srv://cluster0.mongodb.net/mydb
4. 输入用户名密码
5. 选择数据库,浏览集合
(3) 10.3 常用操作
- 右键集合 → "View Documents":浏览数据
- 右键集合 → "Insert Document":插入文档
- 右键文档 → "Edit Document":编辑
- 右键文档 → "Delete Document":删除
- 顶部工具栏 → "Playgrounds":运行 mongosh 脚本
▶ 示例 6:在 VSCode Playgrounds 执行查询
// VSCode MongoDB Playground
use('shopdb');
db.users.aggregate([
{ $group: { _id: '$age', count: { $sum: 1 } } },
{ $sort: { _id: 1 } }
]);
输出:
// 执行成功
11. 第一个 ping 测试
概念说明:db.runCommand({ ping: 1 }) 是 MongoDB 的"心跳"命令,用于验证客户端与服务端的连接是否正常。ping 测试是 MongoDB 连接的第一步——在编写任何业务代码之前,先用 ping 确认连接成功,这是数据库调试的基本原则。
工作原理:ping 命令通过 MongoDB Wire Protocol 发送一个 ping 命令到服务端,服务端返回 { ok: 1 } 表示连接正常。ping 的响应时间等于网络往返延迟 + 服务端处理时间,可用于监控网络质量。在 Node.js 中,ping 命令用于健康检查端点(/healthz)和 CI/CD 预连接测试。
sequenceDiagram
participant App as 客户端
participant Mongo as MongoDB
App->>Mongo: db.runCommand({ ping: 1 })
Mongo-->>App: { ok: 1 }
Note over App,Mongo: 响应时间 = 网络延迟
App->>Mongo: db.runCommand({ ping: 1 })
Mongo-->>App: { ok: 1, operationTime: ... }
| ping 用途 | 说明 |
|---|---|
| 连接验证 | 首次连接后确认服务可达 |
| 延迟监控 | 测量网络往返时间 |
| 健康检查 | /healthz 端点定期检测 |
| CI/CD 预检 | 部署前确认数据库可用 |
(1) 11.1 为什么 ping 重要?
db.runCommand({ ping: 1 }) 是 MongoDB 的"心跳"命令:
- ✅ 验证数据库连接是否成功
- ✅ 测量响应时间(监控网络延迟)
- ✅ 用于健康检查端点(
/healthz) - ✅ 用于 CI/CD 中的预连接测试
(2) 11.2 mongosh 中执行
// 在 mongosh 内执行
db.runCommand({ ping: 1 });
// 输出:
// { ok: 1 }
// 带时间戳的 ping
const start = Date.now();
const result = db.runCommand({ ping: 1 });
const duration = Date.now() - start;
print(`Ping successful in ${duration}ms`);
printjson(result);
(3) 11.3 在 Node.js 中测试连接
// ping-test.js
const { MongoClient } = require('mongodb');
async function testConnection() {
const client = new MongoClient('mongodb://localhost:27017');
try {
const start = Date.now();
await client.connect();
const result = await client.db('admin').command({ ping: 1 });
const duration = Date.now() - start;
console.log(`✅ Connected in ${duration}ms`);
console.log('Ping result:', result);
if (result.ok === 1) {
console.log('🎉 MongoDB connection is healthy!');
} else {
console.error('❌ Ping failed:', result);
}
} catch (err) {
console.error('❌ Connection error:', err.message);
process.exit(1);
} finally {
await client.close();
}
}
testConnection();
▶ 示例 7:完整的健康检查脚本
// health-check.js
const { MongoClient } = require('mongodb');
const mongoose = require('mongoose');
async function healthCheck() {
const results = {
native_driver: false,
mongoose: false,
timestamp: new Date().toISOString()
};
// 1. 测试原生驱动
try {
const client = new MongoClient('mongodb://localhost:27017');
await client.connect();
const ping = await client.db('admin').command({ ping: 1 });
results.native_driver = ping.ok === 1;
await client.close();
console.log('✅ Native driver ping:', ping.ok === 1);
} catch (err) {
console.error('❌ Native driver ping failed:', err.message);
}
// 2. 测试 mongoose
try {
await mongoose.connect('mongodb://localhost:27017/test');
const adminDb = mongoose.connection.db.admin();
const ping = await adminDb.command({ ping: 1 });
results.mongoose = ping.ok === 1;
await mongoose.disconnect();
console.log('✅ Mongoose ping:', ping.ok === 1);
} catch (err) {
console.error('❌ Mongoose ping failed:', err.message);
}
console.log('\nHealth check results:', JSON.stringify(results, null, 2));
return results;
}
healthCheck();
输出:
✅ Native driver ping:
❌ Native driver ping failed:
✅ Mongoose ping:
❌ Mongoose ping failed:
\nHealth check results:
12. 常见安装问题排查
(1) 12.1 连接失败问题
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
ECONNREFUSED 127.0.0.1:27017 |
mongod 未启动 | brew services start mongodb-community@7.0 |
MongoServerSelectionError: connection timeout |
网络问题或 Atlas 白名单未配置 | 在 Atlas Network Access 添加 IP |
Authentication failed |
用户名密码错误 | 重置密码或重新创建用户 |
getaddrinfo ENOTFOUND cluster0.mongodb.net |
DNS 解析失败 | 检查网络或使用 IP 地址 |
Operation timed out |
防火墙拦截 | 开放 27017 端口 |
(2) 12.2 Docker 容器无法启动
# 查看容器日志找原因
docker logs mongodb-dev
# 常见错误:端口被占用
# Error: bind: address already in use
# 解决方案 1:停止占用端口的进程
lsof -i :27017
kill -9 <PID>
# 解决方案 2:改用其他端口
docker run -d --name mongodb-dev -p 27018:27017 mongo:7.0
mongosh "mongodb://localhost:27018"
(3) 12.3 磁盘空间不足
# 检查磁盘空间
df -h
# MongoDB 数据目录默认占用空间
du -sh ~/mongodb-data
# 清理方案:设置 oplogSize 限制(副本集模式)
mongod --oplogSize 1024
# 或使用 WiredTiger 压缩(默认开启)
mongod --wiredTigerCollectionConfig blockCompressor=zstd
▶ 示例 8:完整的故障排查流程
# === 步骤 1:检查 mongod 是否在运行 ===
ps aux | grep mongod | grep -v grep
# === 步骤 2:检查端口监听 ===
lsof -iTCP:27017 -sTCP:LISTEN
# === 步骤 3:尝试连接 ===
mongosh "mongodb://localhost:27017"
# === 步骤 4:查看 mongod 日志 ===
tail -50 /usr/local/var/log/mongodb/mongo.log
# === 步骤 5:重启服务 ===
brew services restart mongodb-community@7.0
# === 步骤 6:再次测试 ===
mongosh "mongodb://localhost:27017" --eval "db.runCommand({ ping: 1 })"
输出:
test> // MongoDB shell 操作成功
❓ 常见问题
--memory --cpus);(4) 生产环境推荐用 Kubernetes + StatefulSet。+srv 是什么意思?mongodb+srv:// 是 DNS SRV 记录格式,用于 MongoDB Atlas 自动发现集群节点。mongodb:// 是传统格式,需手动指定 host:port。📖 小节
- MongoDB 安装方式:Docker(推荐)/ Atlas(云服务)/ 原生安装
- Docker 启动:
docker run -d --name mongodb-dev -p 27017:27017 mongo:7.0 - Atlas 提供 512 MB 永久免费 M0 集群
- mongosh 是 MongoDB 官方命令行客户端(替代旧的 mongo shell)
db.runCommand({ ping: 1 })是验证连接的标准命令- VSCode MongoDB 插件支持图形化浏览 + Playgrounds 执行脚本
- 常见安装问题:端口占用、磁盘空间、防火墙、白名单配置
📝 作业
-
基础题(⭐):使用 Docker 启动 MongoDB 7.0 容器,端口映射 27017,并用 mongosh 连接成功执行
db.runCommand({ ping: 1 })。 -
基础题(⭐):创建 MongoDB Atlas 免费 M0 集群,配置 IP 白名单(0.0.0.0/0)和数据库用户,并使用 mongosh 连接 Atlas。
-
进阶题(⭐⭐):在 mongosh 中执行
use shopdb、db.products.insertOne({...})、db.products.find().pretty(),理解数据库/集合的隐式创建机制。 -
进阶题(⭐⭐):编写 Node.js 脚本
ping-test.js,使用mongodb原生驱动连接本地 MongoDB,执行 ping 命令并输出响应时间。 -
进阶题(⭐⭐):在 VSCode 中安装 MongoDB 插件,连接 Atlas 集群,在 Playgrounds 中执行聚合查询
db.users.aggregate([{$group: {_id: '$age', count: {$sum: 1}}}])。 -
挑战题(⭐⭐⭐):用 Docker Compose 启动一个 3 节点 MongoDB 副本集(参考官方文档),配置 init script 自动创建用户和初始化数据,验证副本集状态
rs.status()。