MongoDB数据库操作技能Skill mongodb-usage

此技能用于MongoDB数据库的操作与管理,涵盖查询数据、展示集合、获取架构、列出数据库、搜索记录和检查索引等功能。适用于数据库开发者和数据工程师,帮助优化数据存储和查询性能。关键词:MongoDB, 数据库查询, 数据管理, 索引优化, 聚合管道, 最佳实践, 后端开发。

后端开发 0 次安装 0 次浏览 更新于 3/16/2026

名称: mongodb-使用 描述: 此技能应在用户请求"查询MongoDB"、“显示数据库集合”、“获取集合架构”、“列出MongoDB数据库”、"在MongoDB中搜索记录"或"检查数据库索引"时使用。

MongoDB 最佳实践

MCP 限制

此MCP在只读模式下运行。 无法进行写入、更新或删除操作。

架构设计模式

嵌入 vs 引用

嵌入当:

  • 数据频繁一起访问
  • 子文档有界(不会无限增长)
  • 一对一或少对多关系
  • 数据不经常改变

引用当:

  • 数据独立访问
  • 多对多关系
  • 文档会超过16MB限制
  • 引用数据频繁更新

常见模式

子集模式: 在父文档中存储频繁访问的子集,完整数据存储在单独的集合中。

桶模式: 将时间序列数据分组到桶中(例如,每小时读数在一个文档中)。

计算模式: 存储预先计算的值以应对昂贵计算。

索引策略

索引指南

  • 索引用于查询、排序和聚合$match阶段的字段
  • 复合索引支持前缀字段的查询
  • 覆盖查询(所有字段在索引中)最快
  • 太多索引会减慢写入

索引类型

  • 单字段: 在一个字段上的基本索引
  • 复合: 多个字段,顺序对查询重要
  • 多键: 自动为数组字段创建
  • 文本: 在字符串内容上的全文搜索
  • TTL: 自动在时间段后过期文档

ESR 规则

对于复合索引,按以下顺序排列字段:

  1. Equality(精确匹配字段)
  2. Sort(排序字段)
  3. 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