macOS MongoDB 深入教程 - 从安装到生产环境部署的完整指南

macOS MongoDB 深入教程

从安装到生产环境部署的完整指南

🍎 macOS 专用 📊 MongoDB 全版本 🚀 生产级配置

📚 教程概述

本教程将带您系统学习在 macOS 系统上安装、配置和使用 MongoDB 数据库。从基础的安装步骤到高级的性能优化,从开发环境配置到生产环境部署,全面覆盖 MongoDB 的各个方面。适合初学者入门和有经验的开发者深入学习。

01

MongoDB 简介与环境准备

1.1 MongoDB 基础概念

NoSQL 数据库特点与应用场景

MongoDB 是一个开源的 NoSQL 文档数据库,采用灵活的 JSON 风格文档存储数据。与传统关系型数据库不同,它提供了更高的灵活性和可扩展性。

✅ NoSQL 优势
  • • 灵活的数据模型
  • • 水平扩展能力强
  • • 高性能读写
  • • 易于开发迭代
🎯 应用场景
  • • 内容管理系统
  • • 实时分析平台
  • • 物联网数据存储
  • • 移动应用后端

MongoDB 核心概念:文档、集合、数据库

{
  "数据库 (Database)": {
    "集合 (Collection)": [
      {
        "文档 (Document)": {
          "_id": ObjectId("507f1f77bcf86cd799439011"),
          "name": "张三",
          "age": 28,
          "email": "[email protected]",
          "tags": ["developer", "mongodb"]
        }
      }
    ]
  }
}
MongoDB 术语 关系型数据库术语 说明
Database Database 数据库
Collection Table 集合/表
Document Row 文档/行
Field Column 字段/列

MongoDB vs 关系型数据库对比

对比维度 MongoDB 关系型数据库
数据模型 文档型(JSON/BSON) 表格型(行列)
Schema 动态 Schema 固定 Schema
扩展方式 水平扩展(分片) 垂直扩展(升级硬件)
事务支持 支持(4.0+) 完全支持
查询语言 MongoDB Query Language SQL

MongoDB 版本选择指南

🆓
Community Edition
  • ✅ 完全免费开源
  • ✅ 核心功能齐全
  • ✅ 社区支持
  • ✅ 适合开发和中小型项目
  • ✅ 包含副本集和分片
推荐场景:个人开发、学习、中小型生产环境
💼
Enterprise Edition
  • ✅ 商业授权
  • ✅ 高级安全特性
  • ✅ 内存存储引擎
  • ✅ 专业技术支持
  • ✅ 高级监控工具
推荐场景:大型企业、金融、医疗等需要高级特性的场景

1.2 macOS 系统要求

支持的 macOS 版本(Intel & Apple Silicon)

Intel 架构
  • • macOS 10.13 (High Sierra) 及以上
  • • macOS 11 (Big Sur) 推荐
  • • macOS 12 (Monterey) 全面支持
  • • macOS 13 (Ventura) 最佳兼容
Apple Silicon (M1/M2/M3)
  • • macOS 11 (Big Sur) 原生支持
  • • M1/M2/M3 芯片完全兼容
  • • ARM64 架构优化版本
  • • 性能提升显著

⚠️ 注意:MongoDB 7.0+ 官方提供了针对 Apple Silicon 的原生 ARM64 版本,性能比 Rosetta 2 转译版本提升约 20-30%。

硬件配置建议

🎓开发/学习环境

CPU

双核处理器

内存

最低 4GB RAM

存储

10GB 可用空间

💻生产环境(小型)

CPU

四核处理器

内存

8GB+ RAM

存储

SSD 50GB+

🚀生产环境(大型)

CPU

八核+ 处理器

内存

16GB+ RAM

存储

NVMe SSD 200GB+

必备工具:Xcode Command Line Tools

在 macOS 上安装 MongoDB 前,需要先安装 Xcode Command Line Tools,这是编译和运行许多开发工具的必备组件。

# 安装 Xcode Command Line Tools

xcode-select --install
验证安装
xcode-select -p
# 输出示例: /Library/Developer/CommandLineTools
检查版本
gcc --version
# 输出会显示 Apple clang version 信息
02

MongoDB 安装方法详解

2.1 使用 Homebrew 安装 推荐

Homebrew 安装与配置

Homebrew 是 macOS 上最流行的包管理器,使用它可以轻松安装和管理 MongoDB。

步骤 1:安装 Homebrew(如果尚未安装)

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

步骤 2:验证 Homebrew 安装

brew --version
# 输出示例: Homebrew 4.2.0

步骤 3:更新 Homebrew

brew update

MongoDB Community Edition 安装步骤

步骤 1:添加 MongoDB 官方 Tap

brew tap mongodb/brew

步骤 2:安装 MongoDB Community Edition

# 安装最新版本
brew install mongodb-community

# 或安装指定版本(例如 7.0)
brew install [email protected]

📦 安装内容包括:

  • mongod - MongoDB 服务器
  • mongos - MongoDB 分片路由
  • • 配置文件:/opt/homebrew/etc/mongod.conf (Apple Silicon)
  • • 或 /usr/local/etc/mongod.conf (Intel)

步骤 3:验证安装

mongod --version
# 输出示例:
# db version v7.0.5
# Build Info: {
#     "version": "7.0.5",
#     "gitVersion": "7809d71e84e314b497f282ea8aa06d7ded3eb205"
# }

MongoDB Shell (mongosh) 安装

MongoDB Shell 是与 MongoDB 交互的现代化命令行工具,替代了旧版的 mongo shell。

# 安装 mongosh
brew install mongosh

# 验证安装
mongosh --version
# 输出示例: 2.1.1
快速测试连接
# 连接到本地 MongoDB(需先启动服务)
mongosh

# 或指定连接字符串
mongosh "mongodb://localhost:27017"

MongoDB Compass(图形化工具)安装

MongoDB Compass 是官方提供的图形化数据库管理工具,提供直观的数据浏览、查询构建和性能分析功能。

方法 1:使用 Homebrew Cask
brew install --cask mongodb-compass
方法 2:官网下载

访问 mongodb.com/compass

下载 .dmg 文件并安装

🌟 Compass 主要功能
  • • 可视化查询构建器
  • • 数据模式分析
  • • 索引性能优化
  • • 聚合管道构建
  • • 实时性能监控
  • • 文档 CRUD 操作
  • • 查询计划解释
  • • 数据导入导出

2.2 手动下载安装包安装

从官网下载 .tgz 安装包

步骤 1:访问 MongoDB 下载中心

🌐 访问:https://www.mongodb.com/try/download/community

  • • 选择版本:MongoDB Community Server
  • • 选择平台:macOS
  • • 选择架构:x64 (Intel) 或 ARM64 (Apple Silicon)
  • • 选择格式:TGZ

步骤 2:使用 curl 下载(命令行方式)

# Intel Mac
curl -O https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-7.0.5.tgz

# Apple Silicon (M1/M2/M3)
curl -O https://fastdl.mongodb.org/osx/mongodb-macos-arm64-7.0.5.tgz

解压与配置环境变量

步骤 1:解压下载的文件

# 解压文件
tar -zxvf mongodb-macos-*.tgz

# 移动到 /usr/local 目录
sudo mv mongodb-macos-*/ /usr/local/mongodb

# 创建软链接(可选)
sudo ln -s /usr/local/mongodb /usr/local/mongodb-current

步骤 2:配置环境变量

# 编辑 .zshrc 文件(macOS Catalina 及更高版本)
nano ~/.zshrc

# 添加以下内容
export PATH="/usr/local/mongodb/bin:$PATH"

# 保存后重新加载配置
source ~/.zshrc

# 验证配置
echo $PATH

💡 提示:如果使用 bash shell,请编辑 ~/.bash_profile~/.bashrc

创建数据目录和日志目录

# 创建数据目录
sudo mkdir -p /usr/local/var/mongodb

# 创建日志目录
sudo mkdir -p /usr/local/var/log/mongodb

# 设置权限(替换 YOUR_USERNAME 为你的用户名)
sudo chown YOUR_USERNAME /usr/local/var/mongodb
sudo chown YOUR_USERNAME /usr/local/var/log/mongodb

# 验证目录创建
ls -la /usr/local/var/ | grep mongodb
测试启动 MongoDB
# 手动启动 MongoDB
mongod --dbpath /usr/local/var/mongodb --logpath /usr/local/var/log/mongodb/mongo.log --fork

# 检查进程
ps aux | grep mongod

# 连接测试
mongosh

2.3 使用 Docker 运行 MongoDB

Docker Desktop for Mac 安装

Docker 提供了一种轻量级、可移植的方式运行 MongoDB,非常适合开发和测试环境。

方法 1:使用 Homebrew
brew install --cask docker
方法 2:官网下载

访问 docker.com/desktop

下载并安装 Docker Desktop

# 验证 Docker 安装
docker --version
# 输出示例: Docker version 24.0.7

docker-compose --version
# 输出示例: Docker Compose version v2.23.0

拉取 MongoDB 官方镜像

# 拉取最新版本
docker pull mongo

# 拉取指定版本
docker pull mongo:7.0

# 拉取特定小版本
docker pull mongo:7.0.5

# 查看已下载的镜像
docker images | grep mongo
可用的镜像标签
mongo:latest
mongo:7.0
mongo:6.0
mongo:5.0
mongo:7.0-rc
mongo:jammy

容器化运行与数据持久化

基础运行:简单启动 MongoDB 容器

# 基础运行(无持久化)
docker run --name mongodb -d -p 27017:27017 mongo:7.0

# 查看容器状态
docker ps

# 查看容器日志
docker logs mongodb

# 进入容器
docker exec -it mongodb mongosh

数据持久化:挂载数据卷

# 创建数据卷
docker volume create mongodb_data

# 运行带持久化的容器
docker run --name mongodb \
  -d \
  -p 27017:27017 \
  -v mongodb_data:/data/db \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=password123 \
  mongo:7.0

# 查看数据卷
docker volume inspect mongodb_data
常用 Docker 命令
# 停止容器
docker stop mongodb

# 启动容器
docker start mongodb

# 重启容器
docker restart mongodb

# 删除容器
docker rm -f mongodb

# 删除镜像
docker rmi mongo:7.0

Docker Compose 配置示例

使用 Docker Compose 可以更方便地管理 MongoDB 容器及其配置。

创建 docker-compose.yml 文件

version: '3.8'

services:
  mongodb:
    image: mongo:7.0
    container_name: mongodb
    restart: always
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password123
      MONGO_INITDB_DATABASE: myapp
    volumes:
      - mongodb_data:/data/db
      - mongodb_config:/data/configdb
      - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
    networks:
      - mongodb_network

  mongo-express:
    image: mongo-express:latest
    container_name: mongo-express
    restart: always
    ports:
      - "8081:8081"
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: admin
      ME_CONFIG_MONGODB_ADMINPASSWORD: password123
      ME_CONFIG_MONGODB_URL: mongodb://admin:password123@mongodb:27017/
      ME_CONFIG_BASICAUTH_USERNAME: admin
      ME_CONFIG_BASICAUTH_PASSWORD: admin123
    depends_on:
      - mongodb
    networks:
      - mongodb_network

volumes:
  mongodb_data:
  mongodb_config:

networks:
  mongodb_network:
    driver: bridge

创建初始化脚本 mongo-init.js

// 创建数据库和用户
db = db.getSiblingDB('myapp');

db.createUser({
  user: 'appuser',
  pwd: 'apppassword',
  roles: [
    {
      role: 'readWrite',
      db: 'myapp'
    }
  ]
});

// 创建示例集合
db.createCollection('users');

// 插入示例数据
db.users.insertMany([
  { name: '张三', email: '[email protected]', age: 28 },
  { name: '李四', email: '[email protected]', age: 32 }
]);

print('Database initialized successfully!');

使用 Docker Compose

# 启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f mongodb

# 停止所有服务
docker-compose down

# 停止并删除数据卷
docker-compose down -v
🎯 访问方式
  • • MongoDB 连接:mongodb://admin:password123@localhost:27017
  • • Mongo Express(Web UI):http://localhost:8081
  • • 用户名/密码:admin / admin123
03

MongoDB 配置与启动

3.1 配置文件详解

mongod.conf 配置文件结构

MongoDB 使用 YAML 格式的配置文件,提供了灵活的配置选项。

配置文件位置
  • • Homebrew (Apple Silicon): /opt/homebrew/etc/mongod.conf
  • • Homebrew (Intel): /usr/local/etc/mongod.conf
  • • 手动安装: /usr/local/mongodb/mongod.conf
# mongod.conf - 完整配置示例

# 系统日志配置
systemLog:
  destination: file
  path: /usr/local/var/log/mongodb/mongo.log
  logAppend: true
  logRotate: reopen

# 存储配置
storage:
  dbPath: /usr/local/var/mongodb
  journal:
    enabled: true
  engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      journalCompressor: snappy
    collectionConfig:
      blockCompressor: snappy
    indexConfig:
      prefixCompression: true

# 网络配置
net:
  port: 27017
  bindIp: 127.0.0.1,::1
  maxIncomingConnections: 65536
  wireObjectCheck: true
  ipv6: false

# 进程管理
processManagement:
  fork: true
  pidFilePath: /usr/local/var/mongodb/mongod.pid
  timeZoneInfo: /usr/share/zoneinfo

# 安全配置
security:
  authorization: disabled
  # authorization: enabled  # 启用认证后取消注释

# 操作分析
operationProfiling:
  mode: off
  slowOpThresholdMs: 100

# 复制配置(副本集)
# replication:
#   replSetName: "rs0"
#   oplogSizeMB: 1024

# 分片配置
# sharding:
#   clusterRole: shardsvr

存储引擎配置(WiredTiger)

WiredTiger 是 MongoDB 默认的存储引擎,提供文档级并发控制和压缩功能。

缓存配置
storage:
  wiredTiger:
    engineConfig:
      # 内存缓存大小(GB)
      # 默认: (RAM - 1GB) / 2
      cacheSizeGB: 1
压缩配置
storage:
  wiredTiger:
    collectionConfig:
      # snappy | zlib | zstd
      blockCompressor: snappy

⚙️ 性能建议:

  • • 开发环境:cacheSizeGB = 0.5-1GB
  • • 小型生产:cacheSizeGB = 2-4GB
  • • 大型生产:cacheSizeGB = (总内存 - 1GB) / 2
  • • 压缩算法:snappy(平衡) | zstd(高压缩) | zlib(中等)

网络配置:IP 绑定与端口设置

net:
  # 监听端口
  port: 27017
  
  # 绑定 IP 地址
  bindIp: 127.0.0.1          # 仅本地访问
  # bindIp: 0.0.0.0          # 允许所有 IP(生产环境谨慎使用)
  # bindIp: 127.0.0.1,192.168.1.100  # 多个 IP
  
  # 最大并发连接数
  maxIncomingConnections: 65536
  
  # TLS/SSL 配置
  tls:
    mode: disabled
    # mode: requireTLS       # 启用 TLS
    # certificateKeyFile: /path/to/certificate.pem
    # CAFile: /path/to/ca.pem
🔒 安全警告

不要在生产环境中使用 bindIp: 0.0.0.0 而不启用认证! 这会使您的数据库暴露在公网上,极易受到攻击。

推荐配置:
  • • 开发环境:bindIp: 127.0.0.1(仅本地)
  • • 生产环境:使用具体 IP + 启用认证 + 防火墙

日志配置与轮转策略

systemLog:
  # 日志输出方式:file | syslog
  destination: file
  
  # 日志文件路径
  path: /usr/local/var/log/mongodb/mongo.log
  
  # 追加模式(而非覆盖)
  logAppend: true
  
  # 日志轮转:rename | reopen
  logRotate: reopen
  
  # 日志详细程度(0-5)
  verbosity: 0
  
  # 组件日志级别
  component:
    accessControl:
      verbosity: 0
    command:
      verbosity: 0
    storage:
      verbosity: 0
      journal:
        verbosity: 1
手动轮转日志
# 方法 1:通过 mongosh
mongosh
> db.adminCommand({ logRotate: 1 })

# 方法 2:发送信号
kill -SIGUSR1 $(pgrep mongod)

安全配置基础

security:
  # 启用访问控制
  authorization: enabled
  
  # JavaScript 执行
  javascriptEnabled: true
  
  # KeyFile 用于副本集认证
  # keyFile: /path/to/keyfile
  
  # LDAP 配置(企业版)
  # ldap:
  #   servers: "ldap.example.com"
  #   bind:
  #     queryUser: "cn=admin,dc=example,dc=com"
  #     queryPassword: "secret"
🔐 启用认证步骤
  1. 1. 在无认证模式下启动 MongoDB
  2. 2. 创建管理员用户
  3. 3. 修改配置文件启用 authorization
  4. 4. 重启 MongoDB 服务
  5. 5. 使用用户名密码连接

3.2 启动与管理服务

使用 brew services 管理 MongoDB

Homebrew Services 提供了便捷的服务管理功能,推荐在 macOS 上使用。

# 启动 MongoDB 服务
brew services start mongodb-community

# 停止 MongoDB 服务
brew services stop mongodb-community

# 重启 MongoDB 服务
brew services restart mongodb-community

# 查看所有服务状态
brew services list

# 查看 MongoDB 服务信息
brew services info mongodb-community
✅ 优点
  • • 自动管理后台运行
  • • 开机自动启动
  • • 统一的服务管理接口
  • • 自动加载配置文件
📋 默认配置
  • • 配置:/opt/homebrew/etc/mongod.conf
  • • 数据:/opt/homebrew/var/mongodb
  • • 日志:/opt/homebrew/var/log/mongodb
  • • 端口:27017

手动启动 mongod 进程

基础启动

# 前台运行(用于调试)
mongod --config /usr/local/etc/mongod.conf

# 后台运行
mongod --config /usr/local/etc/mongod.conf --fork

# 不使用配置文件
mongod --dbpath /usr/local/var/mongodb --logpath /usr/local/var/log/mongodb/mongo.log --fork

常用启动参数

# 指定端口
mongod --port 27018

# 指定数据目录
mongod --dbpath /custom/path/data

# 启用认证
mongod --auth

# 副本集模式
mongod --replSet rs0

# 详细日志
mongod --verbose

# 修复模式(数据损坏时)
mongod --repair --dbpath /usr/local/var/mongodb

⚠️ 注意事项:

  • • 确保数据目录有正确的权限
  • • 避免同时运行多个 mongod 实例使用相同数据目录
  • • 生产环境建议使用配置文件而非命令行参数
  • • 使用 --fork 参数时必须同时指定 --logpath

开机自启动配置

方法 1:使用 Homebrew Services(推荐)

# brew services 自动配置开机启动
brew services start mongodb-community

# 取消开机启动
brew services stop mongodb-community

方法 2:创建 LaunchAgent

# 创建 plist 文件
nano ~/Library/LaunchAgents/com.mongodb.mongod.plist

# 添加以下内容:




  Label
  com.mongodb.mongod
  ProgramArguments
  
    /usr/local/bin/mongod
    --config
    /usr/local/etc/mongod.conf
  
  RunAtLoad
  
  KeepAlive
  
  WorkingDirectory
  /usr/local/var
  StandardErrorPath
  /usr/local/var/log/mongodb/output.log
  StandardOutPath
  /usr/local/var/log/mongodb/output.log

# 加载配置
launchctl load ~/Library/LaunchAgents/com.mongodb.mongod.plist

# 卸载配置
launchctl unload ~/Library/LaunchAgents/com.mongodb.mongod.plist

# 查看状态
launchctl list | grep mongodb

查看服务状态与日志

# 查看进程是否运行
ps aux | grep mongod

# 查看监听端口
lsof -iTCP -sTCP:LISTEN | grep mongod
# 或
netstat -an | grep 27017

# 查看进程详情
pgrep -fl mongod

# 实时查看日志
tail -f /usr/local/var/log/mongodb/mongo.log

# 查看最近 100 行日志
tail -n 100 /usr/local/var/log/mongodb/mongo.log

# 搜索日志中的错误
grep -i "error" /usr/local/var/log/mongodb/mongo.log

# 通过 mongosh 检查状态
mongosh --eval "db.serverStatus()" | head -20
mongosh --eval "db.version()"
📊 状态检查清单
检查项 命令 预期结果
进程运行 ps aux | grep mongod 显示 mongod 进程
端口监听 lsof -i:27017 显示 LISTEN 状态
连接测试 mongosh --eval "db.version()" 显示版本号
日志正常 tail mongo.log 无 ERROR 信息

优雅停止 MongoDB 服务

正确停止 MongoDB 服务可以确保数据完整性和一致性。

# 方法 1:使用 brew services(推荐)
brew services stop mongodb-community

# 方法 2:使用 mongosh 命令
mongosh admin --eval "db.shutdownServer()"

# 方法 3:发送 SIGTERM 信号(优雅停止)
kill -SIGTERM $(pgrep mongod)
# 或
kill $(cat /usr/local/var/mongodb/mongod.pid)

# 方法 4:强制停止(不推荐,可能导致数据损坏)
kill -9 $(pgrep mongod)
✅ 正确的停止方式
  • • brew services stop
  • • db.shutdownServer()
  • • kill -SIGTERM (信号 15)
  • • 等待进程完全退出
❌ 避免的操作
  • • kill -9(强制杀死)
  • • 直接关机/重启
  • • 删除 PID 文件
  • • 断电停止

🔄 停止过程说明:

  1. 1. 停止接受新连接
  2. 2. 等待现有操作完成
  3. 3. 刷新所有数据到磁盘
  4. 4. 关闭所有打开的文件
  5. 5. 安全退出进程
验证服务已停止
# 确认进程已退出
ps aux | grep mongod | grep -v grep
# 应该没有输出

# 确认端口已关闭
lsof -i:27017
# 应该没有输出

# 查看日志最后的信息
tail -20 /usr/local/var/log/mongodb/mongo.log
# 应该看到 "shutdown: going to close listening sockets..."
04

MongoDB Shell 基础操作

4.1 连接与基本命令

mongosh 连接语法

基础连接

# 连接本地默认实例
mongosh

# 指定主机和端口
mongosh --host localhost --port 27017

# 使用连接字符串
mongosh "mongodb://localhost:27017"

# 连接到特定数据库
mongosh mydb
mongosh "mongodb://localhost:27017/mydb"

带认证的连接

# 使用用户名密码
mongosh --username admin --password --authenticationDatabase admin

# 完整连接字符串
mongosh "mongodb://admin:password@localhost:27017/admin"

# 连接后认证
mongosh
> use admin
> db.auth("admin", "password")

高级连接选项

# 使用 TLS/SSL
mongosh "mongodb://localhost:27017/?tls=true"

# 副本集连接
mongosh "mongodb://host1:27017,host2:27017,host3:27017/?replicaSet=rs0"

# 连接 MongoDB Atlas
mongosh "mongodb+srv://username:[email protected]/mydb"

# 只读连接
mongosh "mongodb://localhost:27017/mydb?readPreference=secondary"
🔗 连接字符串格式
mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]

常用参数:

  • authSource - 认证数据库
  • replicaSet - 副本集名称
  • tls - 启用 TLS
  • maxPoolSize - 连接池大小

数据库和集合操作

// 显示所有数据库
show dbs
// 或
show databases

// 切换/创建数据库
use mydb

// 显示当前数据库
db
// 或
db.getName()

// 删除当前数据库
db.dropDatabase()

// 显示数据库统计信息
db.stats()

// 显示所有集合
show collections
// 或
show tables

// 创建集合
db.createCollection("users")

// 创建带选项的集合
db.createCollection("logs", {
  capped: true,
  size: 5242880,
  max: 5000
})

// 删除集合
db.users.drop()

// 重命名集合
db.users.renameCollection("customers")

// 查看集合统计
db.users.stats()
💡 重要概念
  • • 数据库和集合在首次写入数据时自动创建
  • • 空数据库不会出现在 show dbs
  • _id 字段会自动创建并作为主键
  • • 集合名称区分大小写

help 命令体系

MongoDB Shell 提供了完善的帮助系统,可以快速查找命令和方法。

// 全局帮助
help

// 数据库级别帮助
db.help()

// 集合级别帮助
db.collection.help()

// 查看特定方法的帮助
db.collection.find.help()

// 显示所有数据库方法
db.getMongo()

// 显示命令历史
.history

// 清屏
cls
// 或
clear

// 退出
exit
// 或
quit()
常用 Shell 命令
show dbs 列出数据库
use <db> 切换数据库
show collections 列出集合
show users 列出用户
show roles 列出角色
实用快捷键
Tab 自动补全
↑ / ↓ 历史命令
Ctrl+C 取消当前命令
Ctrl+L 清屏
Ctrl+D 退出

4.2 CRUD 操作深入

插入文档:insertOne、insertMany

// insertOne - 插入单个文档
db.users.insertOne({
  name: "张三",
  age: 28,
  email: "[email protected]",
  tags: ["developer", "mongodb"],
  address: {
    city: "北京",
    district: "朝阳区"
  },
  createdAt: new Date()
})

// insertMany - 插入多个文档
db.users.insertMany([
  {
    name: "李四",
    age: 32,
    email: "[email protected]",
    tags: ["designer"]
  },
  {
    name: "王五",
    age: 25,
    email: "[email protected]",
    tags: ["manager", "mongodb"]
  }
])

// 指定 _id
db.users.insertOne({
  _id: "custom-id-001",
  name: "赵六",
  age: 30
})

// 批量插入配置
db.users.insertMany(
  [ /* documents */ ],
  {
    ordered: false,  // 无序插入,遇到错误继续
    writeConcern: { w: "majority", wtimeout: 5000 }
  }
)

💡 插入返回值:

  • acknowledged: 操作是否被确认
  • insertedId: 插入的文档 ID
  • insertedIds: 批量插入的所有 ID

查询文档:find、findOne 与查询运算符

// 查询所有文档
db.users.find()

// 格式化输出
db.users.find().pretty()

// 查询单个文档
db.users.findOne({ name: "张三" })

// 条件查询
db.users.find({ age: 28 })
db.users.find({ age: { $gt: 25 } })  // 大于
db.users.find({ age: { $gte: 25, $lte: 35 } })  // 范围

// 多条件查询 (AND)
db.users.find({
  age: { $gt: 25 },
  "address.city": "北京"
})

// OR 查询
db.users.find({
  $or: [
    { age: { $lt: 25 } },
    { age: { $gt: 35 } }
  ]
})

// 数组查询
db.users.find({ tags: "mongodb" })  // 包含
db.users.find({ tags: { $all: ["developer", "mongodb"] } })  // 全部包含
db.users.find({ tags: { $size: 2 } })  // 数组长度

// 正则表达式
db.users.find({ name: /^张/ })
db.users.find({ email: { $regex: "@example.com$" } })

// 存在性检查
db.users.find({ email: { $exists: true } })
db.users.find({ phone: { $exists: false } })

// 类型检查
db.users.find({ age: { $type: "number" } })

// 投影(选择字段)
db.users.find({}, { name: 1, age: 1, _id: 0 })

// 排序
db.users.find().sort({ age: 1 })  // 升序
db.users.find().sort({ age: -1 })  // 降序

// 限制和跳过
db.users.find().limit(10)
db.users.find().skip(20).limit(10)

// 计数
db.users.countDocuments({ age: { $gt: 25 } })
db.users.estimatedDocumentCount()

// 去重
db.users.distinct("age")
db.users.distinct("tags")
🔍 常用查询运算符

比较运算符

  • $eq 等于
  • $ne 不等于
  • $gt 大于
  • $gte 大于等于
  • $lt 小于
  • $lte 小于等于

逻辑运算符

  • $and
  • $or
  • $not
  • $nor 都不

元素运算符

  • $exists 存在
  • $type 类型

更新文档:updateOne、updateMany、replaceOne

// updateOne - 更新单个文档
db.users.updateOne(
  { name: "张三" },
  { $set: { age: 29 } }
)

// updateMany - 更新多个文档
db.users.updateMany(
  { age: { $lt: 25 } },
  { $set: { status: "junior" } }
)

// replaceOne - 替换整个文档
db.users.replaceOne(
  { name: "张三" },
  {
    name: "张三",
    age: 29,
    email: "[email protected]"
  }
)

// $set - 设置字段
db.users.updateOne(
  { name: "张三" },
  { $set: { "address.city": "上海", phone: "13800138000" } }
)

// $unset - 删除字段
db.users.updateOne(
  { name: "张三" },
  { $unset: { phone: "" } }
)

// $inc - 增加数值
db.users.updateOne(
  { name: "张三" },
  { $inc: { age: 1, loginCount: 1 } }
)

// $mul - 乘法
db.products.updateOne(
  { _id: 1 },
  { $mul: { price: 1.1 } }  // 价格提高 10%
)

// $min / $max - 最小/最大值
db.users.updateOne(
  { name: "张三" },
  { $min: { age: 25 } }  // 如果当前值大于25,设为25
)

// $rename - 重命名字段
db.users.updateMany(
  {},
  { $rename: { "phone": "mobile" } }
)

// $currentDate - 设置当前日期
db.users.updateOne(
  { name: "张三" },
  { $currentDate: { lastModified: true } }
)

// 数组操作
// $push - 添加元素
db.users.updateOne(
  { name: "张三" },
  { $push: { tags: "expert" } }
)

// $addToSet - 添加不重复元素
db.users.updateOne(
  { name: "张三" },
  { $addToSet: { tags: "mongodb" } }
)

// $pull - 删除元素
db.users.updateOne(
  { name: "张三" },
  { $pull: { tags: "beginner" } }
)

// $pop - 删除第一个或最后一个元素
db.users.updateOne(
  { name: "张三" },
  { $pop: { tags: 1 } }  // 1删除最后一个,-1删除第一个
)

// upsert - 不存在则插入
db.users.updateOne(
  { name: "新用户" },
  { $set: { age: 20, email: "[email protected]" } },
  { upsert: true }
)

// 返回更新后的文档
db.users.findOneAndUpdate(
  { name: "张三" },
  { $set: { age: 30 } },
  { returnNewDocument: true }
)
🔄 更新运算符速查

字段运算符

  • $set 设置字段值
  • $unset 删除字段
  • $inc 增加数值
  • $mul 乘法运算
  • $rename 重命名字段

数组运算符

  • $push 添加元素
  • $pull 删除元素
  • $addToSet 添加唯一元素
  • $pop 删除首尾元素
  • $pullAll 删除多个元素

删除文档:deleteOne、deleteMany

// deleteOne - 删除单个文档
db.users.deleteOne({ name: "张三" })

// deleteMany - 删除多个文档
db.users.deleteMany({ age: { $lt: 18 } })

// 删除所有文档(保留集合)
db.users.deleteMany({})

// 返回删除的文档
db.users.findOneAndDelete({ name: "张三" })

// 删除集合
db.users.drop()

// 条件删除
db.users.deleteMany({
  $and: [
    { age: { $gt: 60 } },
    { status: "inactive" }
  ]
})

⚠️ 删除操作警告:

  • • 删除操作不可逆,执行前请确认
  • deleteMany({}) 会删除所有文档
  • • 生产环境建议先用 find() 测试条件
  • • 考虑使用软删除(标记字段)代替物理删除

聚合查询基础

聚合管道提供了强大的数据处理能力,类似于 SQL 的 GROUP BY。

// 基础聚合 - 统计每个年龄的用户数
db.users.aggregate([
  {
    $group: {
      _id: "$age",
      count: { $sum: 1 }
    }
  }
])

// 多阶段聚合
db.users.aggregate([
  // 阶段1: 过滤
  { $match: { age: { $gte: 25 } } },
  
  // 阶段2: 分组统计
  {
    $group: {
      _id: "$address.city",
      avgAge: { $avg: "$age" },
      count: { $sum: 1 }
    }
  },
  
  // 阶段3: 排序
  { $sort: { count: -1 } },
  
  // 阶段4: 限制结果
  { $limit: 5 }
])

// 投影字段
db.users.aggregate([
  {
    $project: {
      name: 1,
      age: 1,
      ageGroup: {
        $cond: {
          if: { $gte: ["$age", 30] },
          then: "senior",
          else: "junior"
        }
      }
    }
  }
])

// 展开数组
db.users.aggregate([
  { $unwind: "$tags" },
  {
    $group: {
      _id: "$tags",
      count: { $sum: 1 }
    }
  }
])

// 添加字段
db.users.aggregate([
  {
    $addFields: {
      fullName: { $concat: ["$firstName", " ", "$lastName"] }
    }
  }
])

// 查找关联
db.orders.aggregate([
  {
    $lookup: {
      from: "products",
      localField: "productId",
      foreignField: "_id",
      as: "productInfo"
    }
  }
])
📊 聚合操作符

管道阶段

  • $match 过滤
  • $group 分组
  • $project 投影
  • $sort 排序
  • $limit 限制

累加器

  • $sum 求和
  • $avg 平均值
  • $min 最小值
  • $max 最大值
  • $first 第一个

其他

  • $unwind 展开
  • $lookup 关联
  • $skip 跳过
  • $count 计数
  • $out 输出

📖 教程章节概览

本教程共包含 12 个完整章节,涵盖从基础到高级的所有内容

第 1-4 章

基础安装与操作

📚

第 5-6 章

数据建模与聚合

🔒

第 7-8 章

安全与备份

💻

第 9 章

开发集成

第 10 章

性能监控与优化

🚀

第 11-12 章

高可用与故障排查

以上展示了前 4 章的完整内容,剩余章节包含更高级的主题和实战案例

05

数据建模与索引优化

📊

第 5 章:数据建模与索引优化

本章将深入探讨 MongoDB 的数据建模最佳实践、Schema 设计模式、索引类型与创建策略、以及查询性能优化技巧。

5.1 文档模型设计

  • • 内嵌文档 vs 引用关系
  • • 一对一、一对多、多对多
  • • Schema 设计模式

5.2 索引策略

  • • 单字段、复合、多键索引
  • • 文本和地理空间索引
  • • explain() 性能分析
🔄

第 6 章:聚合框架深入

深入学习 MongoDB 聚合管道的高级用法,掌握复杂数据分析和处理技巧。

6.1 聚合管道操作符

  • • $match、$project、$group
  • • $lookup 关联查询
  • • $unwind 数组展开

6.2 实战案例

  • • 数据统计与报表生成
  • • 复杂业务查询
  • • 聚合性能优化
🔐

第 7 章:用户认证与安全配置

学习如何保护 MongoDB 数据库安全,配置访问控制、用户权限和网络加密。

7.1 启用访问控制

  • • 创建管理员用户
  • • 启用身份验证
  • • RBAC 角色管理

7.2 网络安全

  • • TLS/SSL 加密配置
  • • IP 白名单设置
  • • 防火墙配置
💾

第 8 章:备份与恢复策略

掌握 MongoDB 数据备份与恢复的各种方法,确保数据安全。

8.1 备份方法

  • • mongodump 逻辑备份
  • • 文件系统快照
  • • 自动化备份脚本

8.2 数据恢复

  • • mongorestore 恢复操作
  • • 时间点恢复 (PITR)
  • • 灾难恢复预案
⚙️

第 9 章:开发集成与驱动使用

学习如何在各种编程语言中集成 MongoDB,包括 Node.js、Python、Java 等。

9.1 Node.js

  • • MongoDB Driver
  • • Mongoose ODM

9.2 Python

  • • PyMongo
  • • Motor 异步

9.3 其他语言

  • • Java、Go
  • • PHP、Ruby
📈

第 10 章:性能监控与优化

深入了解 MongoDB 性能监控工具和优化技巧,提升数据库性能。

10.1 性能监控

  • • MongoDB Compass 分析
  • • serverStatus 命令
  • • 慢查询日志

10.2 性能调优

  • • 查询优化技巧
  • • 内存配置调优
  • • 读写性能优化
🔁

第 11 章:副本集与高可用性

学习配置和管理 MongoDB 副本集,实现高可用性和数据冗余。

11.1 副本集概念

  • • 副本集架构原理
  • • Primary/Secondary 节点
  • • 自动故障转移

11.2 本地搭建

  • • 单机多实例配置
  • • rs.initiate() 初始化
  • • 副本集状态监控
🔧

第 12 章:常见问题排查与解决

掌握 MongoDB 常见问题的诊断和解决方法,快速定位和修复故障。

12.1 安装启动问题

  • • 权限错误处理
  • • 端口占用问题
  • • Apple Silicon 兼容性

12.2 运行时问题

  • • 连接超时处理
  • • 内存溢出排查
  • • 数据损坏修复

⚡ 快速参考

安装命令

brew tap mongodb/brew
brew install mongodb-community
brew services start mongodb-community

连接命令

mongosh
mongosh "mongodb://localhost:27017"
mongosh --username admin --password

基础操作

show dbs
use mydb
db.users.insertOne({name: "张三"})
db.users.find()

查询示例

db.users.find({age: {$gt: 25}})
db.users.find().sort({age: -1})
db.users.find().limit(10)

更新示例

db.users.updateOne(
  {name: "张三"},
  {$set: {age: 30}}
)

备份恢复

mongodump --out /backup
mongorestore /backup
mongodump --db mydb

✨ 最佳实践建议

🔒 安全性最佳实践

  • 始终启用身份验证(--auth)
  • 使用强密码策略
  • 限制网络访问(bindIp)
  • 生产环境启用 TLS/SSL
  • 定期审计用户权限
  • 禁用不必要的服务

性能优化建议

  • 为常用查询创建索引
  • 使用投影限制返回字段
  • 避免全表扫描
  • 合理配置 WiredTiger 缓存
  • 监控慢查询日志
  • 使用连接池管理连接

📊 数据建模建议

  • 根据查询模式设计 Schema
  • 一对少使用内嵌,一对多使用引用
  • 避免过深的嵌套结构
  • 单个文档不超过 16MB
  • 适当使用数据冗余提升性能
  • 考虑数据增长和扩展性

💾 备份与恢复建议

  • 建立自动化备份计划
  • 定期测试恢复流程
  • 使用副本集实现高可用
  • 异地备份防止灾难
  • 保留多个时间点的备份
  • 监控备份任务执行状态

🔧 常见错误与解决方案

错误 1: 端口 27017 被占用

错误信息:Address already in use

原因:端口 27017 已被其他进程占用

解决方案:

# 查找占用端口的进程
lsof -i:27017

# 杀死进程
kill -9 [PID]

# 或使用不同端口启动
mongod --port 27018
错误 2: 数据目录权限不足

错误信息:Permission denied

原因:当前用户没有数据目录的读写权限

解决方案:

# 修改权限
sudo chown -R $(whoami) /usr/local/var/mongodb
sudo chown -R $(whoami) /usr/local/var/log/mongodb

# 或创建新的数据目录
mkdir ~/mongodb-data
mongod --dbpath ~/mongodb-data
错误 3: 连接超时

错误信息:MongoServerError: connection timed out

原因:无法连接到 MongoDB 服务器

解决方案:

# 检查服务是否运行
brew services list | grep mongodb

# 检查端口是否监听
lsof -i:27017

# 查看日志
tail -f /usr/local/var/log/mongodb/mongo.log

# 重启服务
brew services restart mongodb-community
错误 4: Apple Silicon 兼容性问题

错误信息:Bad CPU type in executable

原因:安装了 Intel 版本而非 ARM64 版本

解决方案:

# 卸载现有版本
brew uninstall mongodb-community

# 清理缓存
brew cleanup

# 重新安装(Homebrew 会自动选择 ARM64 版本)
brew tap mongodb/brew
brew install mongodb-community

# 验证架构
file $(which mongod)
# 应显示: arm64
错误 5: 认证失败

错误信息:Authentication failed

原因:用户名、密码错误或认证数据库不正确

解决方案:

# 指定正确的认证数据库
mongosh --username admin --password --authenticationDatabase admin

# 或使用完整连接字符串
mongosh "mongodb://admin:password@localhost:27017/?authSource=admin"

# 重置管理员密码(需要先停止认证)
# 1. 修改配置文件,注释掉 authorization: enabled
# 2. 重启服务
# 3. 更新密码
use admin
db.changeUserPassword("admin", "newPassword")
# 4. 重新启用认证
错误 6: 磁盘空间不足

错误信息:No space left on device

原因:数据目录所在磁盘空间不足

解决方案:

# 检查磁盘空间
df -h

# 清理日志文件
rm /usr/local/var/log/mongodb/*.log.old

# 压缩旧日志
gzip /usr/local/var/log/mongodb/*.log.*

# 清理不需要的数据库
mongosh
> show dbs
> use oldDatabase
> db.dropDatabase()

# 迁移数据目录到更大的磁盘
🎉

恭喜!您已掌握 MongoDB 基础

通过本教程,您已经学习了 MongoDB 在 macOS 上的完整安装、配置和基础操作

📦

安装配置

掌握多种安装方式和配置技巧

💻

基础操作

熟练使用 CRUD 和聚合查询

🚀

进阶学习

了解高级特性和最佳实践

📚 继续学习之旅

MongoDB 是一个功能强大的数据库系统,本教程仅涵盖了基础内容。
建议继续深入学习索引优化、副本集、分片、以及生产环境部署等高级主题。

macOS MongoDB 深入教程 - 完整版

适用于 MongoDB 5.0+ / 6.0+ / 7.0+ | macOS 11+ (Big Sur 及更高版本)

支持 Intel 和 Apple Silicon (M1/M2/M3) 架构

📅 最后更新:2024年 📖 共 12 章节 ⏱️ 学习时长:8-12 小时

互动区域

登录后可以点赞此内容

参与互动

登录后可以点赞和评论此内容,与作者互动交流