用途
MongoDB Natural Language Querying 是一个用于生成只读 MongoDB 查询的技能。它扮演“MongoDB 只读查询与聚合管道生成专家”的角色,把用户的自然语言描述转换为可执行的 find 查询或聚合管道。
主要能力
- 通过 MCP 工具收集上下文:使用 mcp__mongodb__list-databases 和 mcp__mongodb__list-collections 获取数据库名与集合名(若未提供)。
- 获取索引:mcp__mongodb__collection-indexes({ database, collection }),用于查询优化。
- 获取 schema:mcp__mongodb__collection-schema({ database, collection, sampleSize: 50 }),返回扁平化的字段名与类型,包含嵌套文档结构与数组字段。
- 获取样本文档:mcp__mongodb__find({ database, collection, limit: 4 }),用于了解实际数据值与格式、常见模式(枚举、范围等)。
- 在生成查询前校验字段名,避免因 MongoDB 对不存在字段不报错而导致的隐蔽问题。
- 根据需求选择 find 查询或聚合管道,并输出对应格式。
使用方式
- 收集上下文:确认数据库名与集合名,获取索引、schema 和样本文档。
- 分析上下文并校验字段:对照 schema 校验字段名,并查看可用索引以判断查询模式性能。
- 选择查询类型:优先使用 find 查询;当需要分组、聚合函数、多阶段转换、$lookup 连接、数组展开等复杂操作时使用聚合管道。
- 格式化响应:按用户指定的语言或驱动语法输出;若未指定,默认使用 MongoDB shell 语法(键不加引号、使用单引号)。
find 查询响应示例: { "query": { "filter": "{ age: { $gte: 25 } }", "projection": "{ name: 1, age: 1, _id: 0 }", "sort": "{ age: -1 }", "limit": "10" } }
聚合管道响应示例: { "aggregation": { "pipeline": "[{ $match: { status: 'active' } }, { $group: { _id: '$category', total: { $sum: '$amount' } } }]" } }
适用场景
- 需要按自然语言快速构造 MongoDB 只读查询。
- 需要生成带过滤、排序、投影、限制的 find 查询。
- 需要生成包含分组、聚合、连接、数组操作的聚合管道。
- 希望在生成查询时兼顾字段校验与索引覆盖。
限制与注意事项
- 仅生成只读查询(find 或聚合管道)。
- 不使用 $where,因为它会阻止索引使用。
- 不在没有文本索引的情况下使用 $text。
- $expr 仅在必要时使用。
- 避免冗余操作符:已有相等或不等检查时不再添加 $exists;不添加重叠的范围条件。
- 仅投影所需字段;不需要 _id 时添加 _id: 0。
- 数组字段检查建议使用 "arrayField.0": { $exists: true } 判断非空;多条件匹配数组元素使用 $elemMatch;精确长度使用 $size。
- 聚合管道应尽早使用 $match 过滤,末尾使用 $project 整形,适当在 $sort 后加 $limit,并确保 $match 与 $sort 能使用索引。
- 地理坐标需注意 GeoJSON 格式要求经度在前、纬度在后。
- 若无法生成查询,应说明原因、请求澄清、建议替代方案或提供类似示例。
- 为控制上下文大小,可根据 schema 字段宽度调整样本数量:少于 30 字段用 limit: 4;30–80 字段用 limit: 2;80–150 字段用 limit: 1;150+ 字段用 limit: 1 并仅投影相关字段。对大型数组字段可用 $slice: 3 限制数组大小,字符串字段可用 $substr 限制为 100 字符。