简介:本文为MongoDB数据库的完整使用手册,涵盖安装部署、数据建模、CRUD操作、索引优化、聚合框架及高可用架构等核心内容,适合开发者和DBA参考使用。
MongoDB是一款基于分布式文件存储的非关系型数据库(NoSQL),采用文档型数据模型(BSON格式),支持动态模式设计。相较于传统关系型数据库,MongoDB具有以下核心优势:
典型应用场景包括:内容管理系统、实时分析、物联网数据存储、高并发Web应用等。
方式一:官方包安装
# Ubuntu示例
wget https://repo.mongodb.org/apt/ubuntu/dists/ubuntu2204/mongodb-org/6.0/multiverse/binary-amd64/mongodb-org-server_6.0.5_amd64.deb
sudo dpkg -i mongodb-org-server_6.0.5_amd64.deb
sudo systemctl start mongod
方式二:Docker部署
docker run --name mongo-container -d -p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=secure123 \
mongo:6.0
关键配置参数(mongod.conf):
storage:
dbPath: /var/lib/mongodb
wiredTiger:
engineConfig:
cacheSizeGB: 2 # 根据内存调整
net:
bindIp: 0.0.0.0 # 允许远程连接
port: 27017
security:
authorization: enabled # 启用认证
// 创建数据库(自动创建)
use ecommerce
// 创建集合(显式创建带校验)
db.createCollection("products", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "price"],
properties: {
name: { bsonType: "string" },
price: { bsonType: "decimal" },
stock: { bsonType: "int", minimum: 0 }
}
}
}
})
插入文档:
db.products.insertOne({
name: "MongoDB Guide",
price: Decimal128("49.99"),
tags: ["database", "nosql"],
specs: {
version: "6.0",
format: "PDF"
}
})
复杂查询:
// 多条件查询
db.orders.find({
status: "shipped",
$or: [
{ shipDate: { $gte: ISODate("2023-01-01") } },
{ priority: "high" }
]
}).sort({ total: -1 }).limit(10)
// 数组查询
db.customers.find({
addresses: {
$elemMatch: {
type: "shipping",
zip: "10001"
}
}
})
索引类型:
db.users.createIndex({ email: 1 })
db.orders.createIndex({ customerId: 1, date: -1 })
db.places.createIndex({ location: "2dsphere" })
索引优化建议:
explain()
分析查询计划db.collection.stats()
典型电商分析管道:
db.sales.aggregate([
{ $match: { date: { $gte: ISODate("2023-01-01") } } },
{ $group: {
_id: { $month: "$date" },
totalSales: { $sum: "$amount" },
avgPrice: { $avg: "$price" },
count: { $sum: 1 }
}},
{ $sort: { _id: 1 } },
{ $project: {
month: "$_id",
performance: {
$concat: [
"$totalSales",
" (avg: ",
{ $toString: "$avgPrice" },
")"
]
},
_id: 0
}}
])
跨集合事务示例:
const session = db.getMongo().startSession();
try {
session.startTransaction();
db.accounts.updateOne(
{ _id: "cust123" },
{ $inc: { balance: -100 } },
{ session }
);
db.transactions.insertOne({
from: "cust123",
to: "merch456",
amount: 100,
date: new Date()
}, { session });
session.commitTransaction();
} catch (error) {
session.abortTransaction();
throw error;
}
三节点复制集配置示例:
# mongod1配置
replication:
replSetName: "rs0"
enableMajorityReadConcern: true
net:
bindIp: 192.168.1.10
# 初始化命令
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "mongo1:27017" },
{ _id: 1, host: "mongo2:27017" },
{ _id: 2, host: "mongo3:27017", arbiterOnly: true }
]
})
db.serverStatus()
db.currentOp()
db.killOp(<opid>)
慢查询优化:
$hint
强制使用特定索引{ projection: { name: 1, price: 1 } }
内存管理:
wiredTigerCacheSizeGB
参数wiredTiger.cache
指标compact
命令回收空间角色管理示例:
// 创建自定义角色
db.createRole({
role: "analyticsUser",
privileges: [
{ resource: { db: "sales", collection: "" }, actions: ["find"] },
{ resource: { db: "reports", collection: "" }, actions: ["find", "aggregate"] }
],
roles: []
})
// 创建用户并分配角色
db.createUser({
user: "analyst",
pwd: "securePass123",
roles: ["analyticsUser", "readAnyDatabase"]
})
net.tls.mode: requireTLS
auditLog:
destination: file
format: JSON
path: /var/log/mongodb/audit.json
mongodump --host=source --db=ecommerce --out=/backup
mongorestore --host=target --dir=/backup/ecommerce
OpLog捕获:
// 配置secondary节点作为oplog采集点
replication:
oplogSizeMB: 10240 # 增大oplog大小
定时快照:
# 每日凌晨2点执行备份
0 2 * * * /usr/bin/mongodump --uri="mongodb://admin:pass@localhost" --gzip --archive=/backups/daily_$(date +\%Y\%m\%d).gz
实时监听集合变更:
const pipeline = [{ $match: { "fullDocument.status": "paid" } }];
const collection = db.collection("orders");
const changeStream = collection.watch(pipeline);
changeStream.on("change", (change) => {
console.log("New paid order:", change.fullDocument);
});
ACID事务实现:
const session = db.getMongo().startSession();
try {
session.startTransaction({
readConcern: { level: "snapshot" },
writeConcern: { w: "majority" }
});
// 执行多个操作...
await session.commitTransaction();
} catch (error) {
await session.abortTransaction();
throw error;
}
Q1:如何选择合适的分片键?
A:遵循三个原则:
Q2:MongoDB与MySQL如何选择?
| 维度 | MongoDB | MySQL |
|——————-|—————————————|————————————|
| 数据模型 | 文档型,无固定模式 | 表结构,严格模式 |
| 扩展性 | 水平扩展 | 垂直扩展为主 |
| 事务 | 多文档事务(4.0+) | 完整ACID事务 |
| 适用场景 | 半结构化数据、快速迭代 | 结构化数据、复杂事务 |
Q3:如何处理大文档?
建议:
failIndexKeyTooLong
参数控制索引键长度本手册涵盖了MongoDB从基础安装到高级应用的完整知识体系,建议开发者结合实际项目进行实践验证。随着版本更新(当前最新LTS为6.0),建议定期查阅官方变更日志以掌握新特性。