📚 教程概述
本教程将带您系统学习在 macOS 系统上安装、配置和使用 MongoDB 数据库。从基础的安装步骤到高级的性能优化,从开发环境配置到生产环境部署,全面覆盖 MongoDB 的各个方面。适合初学者入门和有经验的开发者深入学习。
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 信息
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
🌟 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
# 验证 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:latestmongo:7.0mongo:6.0mongo:5.0mongo:7.0-rcmongo: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
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. 在无认证模式下启动 MongoDB
- 2. 创建管理员用户
- 3. 修改配置文件启用 authorization
- 4. 重启 MongoDB 服务
- 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. 停止接受新连接
- 2. 等待现有操作完成
- 3. 刷新所有数据到磁盘
- 4. 关闭所有打开的文件
- 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..."
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 章的完整内容,剩余章节包含更高级的主题和实战案例
数据建模与索引优化
第 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
- ✓ 适当使用数据冗余提升性能
- ✓ 考虑数据增长和扩展性
💾 备份与恢复建议
- ✓ 建立自动化备份计划
- ✓ 定期测试恢复流程
- ✓ 使用副本集实现高可用
- ✓ 异地备份防止灾难
- ✓ 保留多个时间点的备份
- ✓ 监控备份任务执行状态
🔧 常见错误与解决方案
错误信息:Address already in use
原因:端口 27017 已被其他进程占用
解决方案:
# 查找占用端口的进程 lsof -i:27017 # 杀死进程 kill -9 [PID] # 或使用不同端口启动 mongod --port 27018
错误信息: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
错误信息: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
错误信息: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
错误信息: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. 重新启用认证
错误信息: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() # 迁移数据目录到更大的磁盘
macOS MongoDB 深入教程 - 完整版
适用于 MongoDB 5.0+ / 6.0+ / 7.0+ | macOS 11+ (Big Sur 及更高版本)
支持 Intel 和 Apple Silicon (M1/M2/M3) 架构