MongoDB: 环境搭建与mongosh:MongoDB开发环境全配置

最后更新:2026-08-26

mongosh 是 MongoDB 官方的命令行客户端——它是你与 MongoDB 交互的最直接工具。

本教程面向零基础开发者,从本地安装到 Atlas 连接,从 mongosh 基础命令到第一个 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 跳过所有本地编译问题。

BASH
# 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 进程,性能最优但需要手动管理。

100%
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) 四种安装方式

100%
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:版本检查命令

BASH
# 检查 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

输出:

TEXT 📖 仅展示
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)将数据持久化到宿主机——容器删除后数据不丢失。

100%
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 前置条件

BASH
# 安装 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 镜像

BASH
# 拉取最新稳定版
docker pull mongo:7.0

# 拉取特定版本(推荐)
docker pull mongo:7.0.5

# 拉取带认证的镜像(生产环境推荐)
docker pull mongo:7.0-auth

(3) 4.3 启动 MongoDB 容器

BASH
# 单机开发模式(无认证)
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 验证连接

BASH
# 用 mongosh 连接
mongosh "mongodb://localhost:27017"

# 在 mongosh 内执行
db.runCommand({ ping: 1 })
# { ok: 1 }

(5) 4.5 常用 Docker 命令

BASH
# 查看容器日志
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 安装

BASH
# 添加 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)

BASH
# 启动 mongod(指定数据目录和日志文件)
mongod --dbpath ~/mongodb-data --logpath ~/mongodb.log --fork

# 验证
ps aux | grep mongod
# mongodb  12345  ... mongod --dbpath /Users/.../mongodb-data

▶ 示例 2:完整 macOS 安装流程

BASH
# === 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 }

输出:

TEXT 📖 仅展示
test> // MongoDB shell 操作成功

6. Linux 安装

(1) Ubuntu / Debian

BASH
# 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

BASH
# 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 安装包(图形化)

TEXT 📖 仅展示
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 安装

POWERSHELL
# 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 完整安装流程

POWERSHELL
# === 1. 创建数据目录 ===
mkdir C:\data\db

# === 2. 启动 MongoDB ===
mongod --dbpath C:\data\db

# === 3. 另一个终端连接 ===
mongosh "mongodb://localhost:27017"

# === 4. 测试 ===
db.runCommand({ ping: 1 })
# { ok: 1 }

输出:

TEXT 📖 仅展示
// 执行成功

8. MongoDB Atlas 云服务配置

概念说明:MongoDB Atlas 是官方全托管云数据库服务,覆盖 AWS/Azure/GCP 三大云平台。对于团队协作和跨国部署场景,Atlas 是最佳选择——免运维、自动备份、全球部署、内置监控。Atlas 提供 512 MB 永久免费层(M0 Sandbox),足够学习和小型项目使用。

工作原理:Atlas 在云平台上自动部署 3 节点副本集,Primary 处理写入请求,两个 Secondary 提供读取冗余和自动故障转移。用户通过 Atlas Web 控制台管理集群、配置网络白名单、创建数据库用户。连接字符串支持 mongodb+srv:// 格式,通过 DNS SRV 记录自动发现集群节点。

100%
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 创建免费集群

TEXT 📖 仅展示
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 配置访问权限

TEXT 📖 仅展示
步骤 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 获取连接字符串

TEXT 📖 仅展示
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 集群

BASH
# 用 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' }

输出:

TEXT 📖 仅展示
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 dbsuse 等),所有操作都通过 JavaScript 语法执行。

100%
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

BASH
# 连接本地默认端口
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 基础命令

JAVASCRIPT
// === 数据库操作 ===
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 脚本文件

BASH
# === 编写脚本(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

输出:

TEXT 📖 仅展示
test> // MongoDB shell 操作成功

10. VSCode MongoDB 插件

(1) 10.1 安装插件

TEXT 📖 仅展示
1. 打开 VSCode
2. Extensions (Ctrl+Shift+X)
3. 搜索 "MongoDB for VS Code"
4. 点击 Install(官方插件,由 MongoDB Inc. 提供)

(2) 10.2 连接数据库

TEXT 📖 仅展示
1. 点击侧边栏 MongoDB 图标
2. 点击 "Add Connection"
3. 输入连接字符串:
   - 本地:mongodb://localhost:27017
   - Atlas:mongodb+srv://cluster0.mongodb.net/mydb
4. 输入用户名密码
5. 选择数据库,浏览集合

(3) 10.3 常用操作

TEXT 📖 仅展示
- 右键集合 → "View Documents":浏览数据
- 右键集合 → "Insert Document":插入文档
- 右键文档 → "Edit Document":编辑
- 右键文档 → "Delete Document":删除
- 顶部工具栏 → "Playgrounds":运行 mongosh 脚本

▶ 示例 6:在 VSCode Playgrounds 执行查询

JAVASCRIPT
// VSCode MongoDB Playground
use('shopdb');

db.users.aggregate([
  { $group: { _id: '$age', count: { $sum: 1 } } },
  { $sort: { _id: 1 } }
]);

输出:

TEXT 📖 仅展示
// 执行成功

11. 第一个 ping 测试

概念说明db.runCommand({ ping: 1 }) 是 MongoDB 的"心跳"命令,用于验证客户端与服务端的连接是否正常。ping 测试是 MongoDB 连接的第一步——在编写任何业务代码之前,先用 ping 确认连接成功,这是数据库调试的基本原则。

工作原理:ping 命令通过 MongoDB Wire Protocol 发送一个 ping 命令到服务端,服务端返回 { ok: 1 } 表示连接正常。ping 的响应时间等于网络往返延迟 + 服务端处理时间,可用于监控网络质量。在 Node.js 中,ping 命令用于健康检查端点(/healthz)和 CI/CD 预连接测试。

100%
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 的"心跳"命令:

(2) 11.2 mongosh 中执行

JAVASCRIPT
// 在 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 中测试连接

JAVASCRIPT
// 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:完整的健康检查脚本

JAVASCRIPT
// 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();

输出:

TEXT 📖 仅展示
✅ 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 容器无法启动

BASH
# 查看容器日志找原因
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 磁盘空间不足

BASH
# 检查磁盘空间
df -h

# MongoDB 数据目录默认占用空间
du -sh ~/mongodb-data

# 清理方案:设置 oplogSize 限制(副本集模式)
mongod --oplogSize 1024

# 或使用 WiredTiger 压缩(默认开启)
mongod --wiredTigerCollectionConfig blockCompressor=zstd

▶ 示例 8:完整的故障排查流程

BASH
# === 步骤 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 })"

输出:

TEXT 📖 仅展示
test> // MongoDB shell 操作成功

❓ 常见问题

Q Docker 和原生安装哪个更好?
A 本地开发推荐 Docker(跨平台、隔离、快速)。生产环境推荐原生安装(性能更好、易调试)。本教程用 Docker 演示,便于所有读者复现。
Q Atlas 免费集群会过期吗?
A 不会。MongoDB Atlas 的 M0 Sandbox(512 MB)永久免费,无使用期限。但需每 90 天登录一次避免回收。
Q mongosh 和旧的 mongo shell 有什么区别?
A mongosh 是 mongo shell 的继任者(2020 年后推荐使用)。mongosh 基于 Node.js,支持现代 JS 语法、语法高亮、错误堆栈,更适合开发。
Q 为什么 MongoDB 7.0 之后没有 8.0 LTS?
A MongoDB 8.0 已于 2024 年发布,正在向 LTS 候选演进。本教程基于稳定的 7.0 LTS,覆盖绝大多数生产场景。
Q 能在生产环境用 Docker 部署 MongoDB 吗?
A 可以,但需注意:(1) 使用 host network 或固定 IP;(2) 数据卷必须挂载到物理机;(3) 配置资源限制(--memory --cpus);(4) 生产环境推荐用 Kubernetes + StatefulSet。
Q 连接字符串中的 +srv 是什么意思?
A mongodb+srv:// 是 DNS SRV 记录格式,用于 MongoDB Atlas 自动发现集群节点。mongodb:// 是传统格式,需手动指定 host:port。
Q 如何在公司内网部署(无法访问 Atlas)?
A 用 Docker 或原生安装自建 MongoDB,端口 27017,配置防火墙允许应用服务器 IP 访问。无须 Atlas 云服务。

📖 小节


📝 作业

  1. 基础题(⭐):使用 Docker 启动 MongoDB 7.0 容器,端口映射 27017,并用 mongosh 连接成功执行 db.runCommand({ ping: 1 })

  2. 基础题(⭐):创建 MongoDB Atlas 免费 M0 集群,配置 IP 白名单(0.0.0.0/0)和数据库用户,并使用 mongosh 连接 Atlas。

  3. 进阶题(⭐⭐):在 mongosh 中执行 use shopdbdb.products.insertOne({...})db.products.find().pretty(),理解数据库/集合的隐式创建机制。

  4. 进阶题(⭐⭐):编写 Node.js 脚本 ping-test.js,使用 mongodb 原生驱动连接本地 MongoDB,执行 ping 命令并输出响应时间。

  5. 进阶题(⭐⭐):在 VSCode 中安装 MongoDB 插件,连接 Atlas 集群,在 Playgrounds 中执行聚合查询 db.users.aggregate([{$group: {_id: '$age', count: {$sum: 1}}}])

  6. 挑战题(⭐⭐⭐):用 Docker Compose 启动一个 3 节点 MongoDB 副本集(参考官方文档),配置 init script 自动创建用户和初始化数据,验证副本集状态 rs.status()

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏