名称: mongodb-使用 描述: 此技能应在用户请求"查询MongoDB"、“显示数据库集合”、“获取集合架构”、“列出MongoDB数据库”、"在MongoDB中搜索记录"或"检查数据库索引"时使用。
MongoDB 最佳实践
MCP 限制
此MCP在只读模式下运行。 无法进行写入、更新或删除操作。
架构设计模式
嵌入 vs 引用
嵌入当:
- 数据频繁一起访问
- 子文档有界(不会无限增长)
- 一对一或少对多关系
- 数据不经常改变
引用当:
- 数据独立访问
- 多对多关系
- 文档会超过16MB限制
- 引用数据频繁更新
常见模式
子集模式: 在父文档中存储频繁访问的子集,完整数据存储在单独的集合中。
桶模式: 将时间序列数据分组到桶中(例如,每小时读数在一个文档中)。
计算模式: 存储预先计算的值以应对昂贵计算。
索引策略
索引指南
- 索引用于查询、排序和聚合$match阶段的字段
- 复合索引支持前缀字段的查询
- 覆盖查询(所有字段在索引中)最快
- 太多索引会减慢写入
索引类型
- 单字段: 在一个字段上的基本索引
- 复合: 多个字段,顺序对查询重要
- 多键: 自动为数组字段创建
- 文本: 在字符串内容上的全文搜索
- TTL: 自动在时间段后过期文档
ESR 规则
对于复合索引,按以下顺序排列字段:
- Equality(精确匹配字段)
- Sort(排序字段)
- Range(范围查询字段如$gt, $lt)
聚合管道
性能提示
- 尽早放置
$match和$project以减少文档 - 尽早使用
$limit当可能时 - 避免在没有索引的大型集合上使用
$lookup - 使用
$facet在一个查询中进行多个聚合
常见阶段
// 过滤文档
{ $match: { status: "active" } }
// 重塑文档
{ $project: { name: 1, total: { $sum: "$items.price" } } }
// 分组和聚合
{ $group: { _id: "$category", count: { $sum: 1 } } }
// 排序结果
{ $sort: { count: -1 } }
// 连接集合
{ $lookup: { from: "orders", localField: "_id", foreignField: "userId", as: "orders" } }
连接最佳实践
连接字符串格式
- Atlas:
mongodb+srv://user:pass@cluster.mongodb.net/database - 本地:
mongodb://localhost:27017/database - 副本集:
mongodb://host1,host2,host3/database?replicaSet=rs0
连接池
- 在应用程序中使用连接池(驱动程序中默认)
- 为工作负载设置适当的池大小
- 不要为每个请求创建新连接
应避免的反模式
- 无界数组: 无限增长的数组
- 巨大文档: 接近16MB的文档
- 过多集合: 使用嵌入代替
- 缺失索引: 查询进行集合扫描
- $where 运算符: 为安全使用聚合代替
- 在文档中存储文件: 对大型文件使用GridFS