数据库
用自然语言生成只读 MongoDB 查询或聚合管道(需…
当用户想用自然语言编写、生成 MongoDB 的 find 查询或聚合管道(含 SQL 风格请求转换)时,借助集合 schema、索引和样本数据生成正确的只读查询。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用自然语言生成只读 MongoDB 查询特定
解决思路
- 先用 MCP 工具收集上下文:若未提供数据库名和集合名,调用 mcp__mongodb__list-databases 和 mcp__mongodb__list-collections 获取,并明确用户的自然语言查询需求。
- 按顺序获取信息:先调用 mcp__mongodb__collection-indexes({ database, collection }) 获取索引用于查询优化;再调用 mcp__mongodb__collection-schema({ database, collection, sampleSize: 50 }) 获取扁平化 schema(含字段名、类型、嵌套结构和数组字段);最后调用 mcp__mongodb__find({ database, collection, limit: 4 }) 获取样本文档以了解真实数据取值和格式。
- 生成查询前先对照 schema 校验字段名,因为 MongoDB 对不存在的字段不会报错,只会返回空结果或异常行为,难以排查;同时查看可用索引以判断哪种查询模式性能最佳。
- 优先选择 find 查询而非聚合管道,因为 find 更简单、更易被其他开发者理解;仅在需要分组/聚合函数(sum、count、average 等)、多阶段转换、跨集合 join($lookup)、数组展开或复杂数组操作时才使用聚合管道。
- 按用户指定的语言或驱动语法输出查询;若未指定,则始终使用 MongoDB shell 语法(键不加引号、字符串用单引号)以便阅读和兼容 MongoDB 工具。
- find 查询响应格式为 JSON,包含 query 对象,内含 filter、projection、sort、limit 字段;聚合管道响应格式为 JSON,包含 aggregation 对象,内含 pipeline 字符串。
- 生成正确满足用户全部需求的查询后,再检查现有索引能否支持;若无合适索引,在回复中说明(用户可能想创建)。
- 绝不使用 $where,因为它会阻止索引使用;没有文本索引时不要使用 $text;$expr 仅在必要时使用,尽量少用。
- 避免冗余操作符:已有等值或不等值条件(如 status: "active" 或 age: { $gt: 25 })时不要再加 $exists;不要叠加重叠的范围条件(如同时用 $gte: 0 和 $gt: -1);每个条件都应提供尚未被覆盖的有效过滤。
- 只投影需要的字段以减少数据传输;当不需要 _id 字段时在投影中加上 _id: 0。
- 使用合适的操作符:$eq、$ne、$gt、$gte、$lt、$lte 用于比较;$in、$nin 用于匹配一组可能值(等价于多个 $eq/$ne 的 OR);$and、$or、$not、$nor 用于逻辑运算;$regex 用于区分大小写的文本模式匹配(尽量用左锚定模式如 /^prefix/ 以便高效利用索引);$exists 用于字段存在性检查(优先用 a: {$ne: null} 而非 a: {$exists: true} 以利用索引);$type 用于类型匹配。
- 优化数组字段检查:判断数组非空用 "arrayField.0": {$exists: true},而不是 arrayField: {$exists: true, $type: "array", $ne: []},前者更简单、可读且高效;匹配数组元素多个条件用 $elemMatch;需要精确数量时用 $size。
- 聚合管道中尽早使用 $match 过滤以减少文档;在管道末尾用 $project 正确塑造返回给客户端的文档;在 $sort 之后适当加 $limit。
- 确保 $match 和 $sort 阶段能使用索引:把 $match 放在管道开头;初始的 $match 和 $sort 阶段若位于任何修改文档的阶段之前即可使用索引;生成 $match 过滤后检查索引能否支持;尽量减少首个 $match 之前的文档转换阶段。
- 优化 $lookup:对频繁 join 的数据考虑反规范化。
- 防止错误:对照 schema 校验所有字段引用;正确引用字段名,嵌套字段用点号表示法;转义正则中的特殊字符;检查数据类型,确保字段值与 schema 中的类型匹配。
- 地理坐标注意:MongoDB 的 GeoJSON 格式要求先经度后纬度(如 [longitude, latitude] 或 {type: "Point", coordinates: [lng, lat]}),这与日常英文书写顺序相反,生成地理查询时务必核对。
- 分析样本文档时关注:字段类型(String、Number、Boolean、Date、ObjectId、Array、Object)、字段模式(必填 vs 可选,检查多个样本)、嵌套结构(对象套对象、对象数组)、数组元素(同质 vs 异质)、特殊类型(日期、ObjectId、二进制、GeoJSON)。
- 利用样本文档理解真实取值和范围、识别字段命名约定(camelCase、snake_case 等)、发现常见模式(如状态枚举、分类取值)、估算分组操作基数、验证查询能否在真实数据上工作。
- 无法生成查询时:解释原因(缺 schema、需求模糊、查询不可行)、请求澄清需求细节、建议替代方案、给出可用的相似查询示例。
- 控制上下文大小:按 schema 宽度调整样本数量——少于 30 字段用 limit: 4(默认);30–80 字段用 limit: 2;80–150 字段用 limit: 1;150+ 字段用 limit: 1 并只投影与用户查询相关的字段。
- 预览大数组字段和字符串:若 schema 文档含数组,在样本投影中用 $slice: 3 限制数组大小;用 $substr 把字符串字段限制为 100 字符,防止过长值占用上下文。
适用边界 · 注意事项
- 不处理 Atlas Search($search 操作符)、向量/语义搜索($vectorSearch 操作符)、模糊匹配、自动补全索引或相关性评分——这些应使用 search-and-ai。
- 不分析或优化已有查询——应使用 mongodb-query-optimizer。
- 不处理涉及写操作的聚合管道。