文档型数据库核心概念
1 )关系型 vs 非关系型架构对比
数据库架构对比
| 特性 | 关系型数据库(MySQL) | 文档型数据库(MongoDB) |
|---|---|---|
| 数据结构 | 二维表格 | BSON文档 |
| 存储单元 | 行(记录) | 文档 |
| 模式约束 | 严格预定义Schema | 动态Schema |
| 数据关联 | 外键关联 | 嵌套文档/引用 |
| 扩展方式 | 垂直扩展 | 水平分片 |
| 典型查询语言 | SQL | MQL(MongoDB查询语言) |
-- 关系型数据库示例
CREATE TABLE accounts (
account_id INT PRIMARY KEY,
balance DECIMAL,
customer_id INT FOREIGN KEY REFERENCES customers(customer_id)
);
2 )文档模型核心特性
-
动态模式(Dynamic Schema)
同一集合可包含不同结构的文档,新增字段无需修改历史数据:// accounts集合中的异构文档 { "_id": ObjectId("5f1d7f3e4ae1c81a3c8d4b9a"), "account_number": "A1001", "balance": 5000.00 } { "_id": ObjectId("5f1d7f4a4ae1c81a3c8d4b9b"), "customer_name": "张三", "phone": "13800138000", "vip_level": 3 } -
嵌套文档支持
复杂关系扁平化存储,减少关联查询:{ "order_id": "ORD202307001", "items": [ { "product": "Laptop", "price": 8999 }, { "product": "Mouse", "price": 199 } ], "customer": { "name": "李四", "address": "北京朝阳区" } } -
BSON数据格式
二进制JSON扩展格式,支持丰富数据类型:
MongoDB操作实战
1 )基础CRUD操作
// 原生MongoDB Shell操作
db.accounts.insertMany([
{
account_number: "A1002",
balance: 12000,
opened_date: new Date("2023-01-15")
},
{
account_number: "A1003",
customer_name: "王五",
email: "wangwu@example.com"
}
]);
// 动态字段查询
db.accounts.find({
$or: [
{ "customer_info.name": { $exists: true }},
{ "customer_name": { $exists: true }}
]
});
2 ) NestJS集成方案
TypeScript-Mongoose
// 定义动态模式Schema
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document } from 'mongoose';
@Schema({ strict: false }) // 关闭严格模式允许动态字段
export class Account extends Document {
@Prop({ required: true, index: true })
account_number: string;
@Prop({ default: 0 })
balance: number;
@Prop({ type: Object })
customer_info?: {
name: string;
phone: string;
};
}
export const AccountSchema = SchemaFactory.createForClass(Account);
// CRUD服务实现
@Injectable()
export class AccountService {
constructor(@InjectModel(Account.name) private accountModel: Model<Account>) {}
async create Promise<Account> {
const created = new this.accountModel(data);
return created.save();
}
async findByAccountNumber(num: string): Promise<Account> {
return this.accountModel.findOne({ account_number: num }).exec();
}
}
3 )聚合管道高级查询
// 多阶段数据处理管道
db.sales.aggregate([
{ $match: { date: { $gt: ISODate("2023-01-01") } }},
{ $group: {
_id: "$product",
total: { $sum: "$amount" },
avg: { $avg: "$price" }
}},
{ $sort: { total: -1 } }
]);
高级架构与性能优化
1 ) 分布式架构组件
分布式架构核心
| 组件 | 功能描述 | 关键技术 |
|---|---|---|
| 复制集 | 数据高可用保障 | 自动故障转移、读写分离 |
| 分片 | 水平扩展解决方案 | 哈希/范围分片策略 |
| OPLOG | 操作日志同步 | 幂等性操作保障 |
2 ) 性能优化机制
-
索引策略
- B树/B+树索引结构
- 多键索引(数组字段)
- 地理空间索引(2dsphere)
// 创建复合索引 db.orders.createIndex({ customer_id: 1, order_date: -1 }); -
分片集群配置
// NestJS分片配置示例 import { ShardingModule } from '@nestjs/sharding'; @Module({ imports: [ ShardingModule.forRoot({ shards: [ { host: 'shard01:27017' }, { host: 'shard02:27017' } ], shardKey: { userId: 1 } // 分片键定义 }) ] }) export class AppModule {}
3.3 运维监控体系
- 诊断工具:mongotop(I/O分析)、mongostat(实时统计)
- 日志分析:慢查询日志(profiling)
- 备份策略:
mongodump --host rs0/192.168.1.10:27017,192.168.1.11:27017 \ --out /backup/20230701 --oplog
学习路径与应用场景
系统化学习路径
| 阶段 | 目标 | 核心内容 |
|---|---|---|
| 基础操作实践 | 搭建Web服务支持MongoDB | CRUD操作,Shell命令 |
| 原理深度解析 | 理解索引/复制集机制 | B-Tree结构,Oplog同步原理 |
| 运维管理实战 | 掌握分片集群与灾备方案 | 分片策略,备份恢复工具链 |
-
基础操作阶段
- CRUD操作与MongoDB Shell使用
- 基础数据建模(嵌入式vs引用式)
- 索引创建与查询优化
-
原理深度解析
- 复制集选举机制
- 分片数据路由原理
- 聚合管道执行过程
- 存储引擎原理(WiredTiger)
-
运维管理实战
- 集群部署与扩容
- 性能监控与调优
- 备份恢复策略
- 安全认证配置
技术优势与适用场景
文档模型核心价值:
- 开发效率提升:数据结构自然映射对象模型
- 灵活演进能力:免Schema迁移成本
- 大数据处理优化:嵌入式文档减少JOIN操作
典型应用场景
| 场景类型 | 适用原因 | 案例 |
|---|---|---|
| 实时分析系统 | 高吞吐写入与聚合能力 | 用户行为分析平台 |
| 内容管理系统(CMS) | 灵活的内容结构管理 | 多语言新闻门户 |
| IoT数据流 | 时序数据处理能力 | 传感器数据采集 |
| 用户画像 | 半结构化数据存储 | 电商推荐系统 |
架构选择建议:金融核心系统等强事务场景建议采用关系型数据库,MongoDB在快速迭代开发、半结构化数据处理场景优势显著
760

被折叠的 条评论
为什么被折叠?



