Install
openclaw skills install @thcjp/mongo-manager-freeopenclaw skills install @thcjp/mongo-manager-free本工具为MongoDB开发者提供Schema设计、查询编写与性能优化的实战指南。免费版覆盖核心场景:Schema建模、索引策略、聚合管道、一致性配置,足以应对绝大多数业务开发需求。
MongoDB作为文档型NoSQL数据库的代表,凭借灵活的Schema、水平扩展能力与丰富的查询语法,已成为现代应用开发的主流选择之一。然而其"schemaless"特性常被误解为"无需设计Schema",实际上MongoDB的Schema设计直接影响查询性能、写入吞吐与存储成本。
本工具以原创中文实战指南形式,系统化覆盖MongoDB开发中的高频问题,帮助开发者从"能用"升级为"用好"。
| 能力分类 | 说明 |
|---|---|
| Schema设计 | 嵌入vs引用决策、文档大小控制、数组管理 |
| 索引策略 | ESR规则、复合索引、TTL索引、文本索引 |
| 聚合管道 | 分阶段构建、$match前置、$lookup优化 |
| 一致性配置 | 读写关注、读偏好、因果一致性 |
| 性能诊断 | explain执行计划、COLLSCAN检测、覆盖查询 |
| 常见陷阱 | 文档大小、数组增长、$lookup性能 |
技术实现要点:核心能力基于input_params参数与output_format配置实现,支持创建/查询/修改/删除等操作模式,通过config_options进行运行时配置。 |
用input_params参数进行配置。
输入: 用户提供核心功能执行所需的指令和必要参数。 处理: 解析核心功能执行的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回核心功能执行的响应数据,包含状态码、结果和日志。
input_params参数,支持创建/查询/导出操作用config_options参数进行配置。
输入: 用户提供参数配置与调用所需的指令和必要参数。 处理: 解析参数配置与调用的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回参数配置与调用的响应数据,包含状态码、结果和日志。
config_options参数,支持修改/重置/导入操作用output_format参数进行配置。
输入: 用户提供结果处理与输出所需的指令和必要参数。 处理: 解析结果处理与输出的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回结果处理与输出的响应数据,包含状态码、结果和日志。
output_format参数,支持导出/保存/转换操作
能力覆盖范围:本skill的核心能力覆盖以下场景关键词:Agent、MongoDB、设计与优化指南、一致性配置等核心、开发者的数据库设、计与优化实战指南、通过原创中文文档、建模哲学、一致性模式、性能调优等核心主、配套常见陷阱清单、与故障排查表、帮助开发者避开、使用中的高频坑点、Use、when、需要数据库操作、SQL、数据存储管理时使、不适用于数据库架、构设计决策等。这些关键词对应description中声明的使用场景,均已在上述能力点中提供对应的操作支持。从需求出发设计文档结构,决定哪些数据嵌入、哪些数据引用,避免后期重构。
通过explain分析执行计划,识别全表扫描、索引缺失、选择性差等问题。
对复杂统计查询进行分阶段调优,前置$match减少数据量,合理使用索引。
根据业务场景选择合适的读写关注级别,平衡性能与一致性。
MongoDB Schema设计核心原则:
ESR规则决定复合索引字段顺序:
// 查询:{status: "active", age: {$gte: 18}}.sort({createdAt: -1})
// 索引:{status: 1, createdAt: -1, age: 1} // E-S-R顺序
db.users.createIndex({status: 1, createdAt: -1, age: 1})
// 查看执行计划
db.users.find({status: "active"}).explain("executionStats")
// ...
// 关键指标:
// - winningStage.stage: IXSCAN(好)vs COLLSCAN(差)
// - totalDocsExamined: 扫描文档数
// - nReturned: 返回文档数
// 理想:totalDocsExamined ≈ nReturned
完整上手时间约120秒。
// 嵌入模式:适合一起查询的小数据
{
_id: ObjectId("..."),
name: "张三",
addresses: [
{type: "home", city: "北京", detail: "朝阳区..."},
{type: "work", city: "北京", detail: "海淀区..."}
]
}
// ...
// 引用模式:适合独立访问或大体量数据
// users集合
{
_id: ObjectId("..."),
name: "张三"
}
// addresses集合
{
_id: ObjectId("..."),
userId: ObjectId("..."), // 引用用户
type: "home",
city: "北京",
detail: "朝阳区..."
}
// 单字段索引
db.users.createIndex({email: 1}, {unique: true})
// ...
// 复合索引(遵循ESR规则)
db.orders.createIndex({userId: 1, status: 1, createdAt: -1})
// ...
// TTL索引(自动过期)
db.sessions.createIndex({createdAt: 1}, {expireAfterSeconds: 86400})
// ...
// 文本索引
db.articles.createIndex({title: "text", content: "text"})
// 统计每个用户的订单数与总金额
db.orders.aggregate([
// 1. $match前置,利用索引减少数据量
{$match: {status: "completed", createdAt: {$gte: ISODate("2026-01-01")}}},
// ...
// 2. $group聚合
{$group: {
_id: "$userId",
orderCount: {$sum: 1},
totalAmount: {$sum: "$amount"}
}},
// ...
// 3. $sort排序
{$sort: {totalAmount: -1}},
// ...
// 4. $limit限制
{$limit: 100}
])
// 强一致性(牺牲性能)
db.collection.insertOne(doc, {writeConcern: {w: "majority"}})
db.collection.find({}).readConcern("majority").readPref("primary")
// ...
// 最终一致性(高性能,可读从节点)
db.collection.find({}).readPref("secondaryPreferred")
// ...
// 因果一致性(读己之写)
const session = db.getMongo().startSession({causalConsistency: true})
db.collection.find({}, {}, {session})
MongoDB单文档上限16MB,从设计阶段就要规划:
// 错误:无限$push导致文档膨胀
db.posts.updateOne({_id: postId}, {$push: {comments: newComment}})
// ...
// 正确:限制数组长度
db.posts.updateOne({_id: postId}, {
$push: {comments: {$each: [newComment], $slice: -100}}
})
$match前置可利用索引$project及早减少字段$match在$unwind后无法用索引为基数高(区分度大)的字段建索引。性别字段只有2个值,索引选择性差,不如全表扫描。
// 连接字符串启用retryWrites
mongodb://host:27017/db?retryWrites=true
A:不是。MongoDB不强制Schema,但仍然需要Schema设计,只是Schema在应用层而非数据库层强制。糟糕的Schema设计会导致查询性能差、数据冗余、更新困难。
A:(1) 一起查询且数据量小→嵌入;(2) 独立访问或数据量大→引用;(3) 多对多关系→引用;(4) 数据会无限增长→引用。
A:(1) MongoDB 5.0+支持$lookup带pipeline,可先过滤再关联;(2) 频繁$lookup说明应考虑嵌入;(3) 对外键字段建索引;(4) 限制关联数据量。
A:(1) 文档膨胀接近16MB上限;(2) 多键索引体积爆炸;(3) 文档内分页困难。建议改用引用模式或桶模式(bucketing)。
A:重点关注:winningStage.stage(IXSCAN好,COLLSCAN差)、totalDocsExamined(扫描数)、nReturned(返回数)。理想状态是totalDocsExamined ≈ nReturned,覆盖查询时totalDocsExamined = 0。
A:复制延迟通常在毫秒到秒级。需要"读己之写"的场景使用readPref("primary")或因果一致性会话。nearest读偏好延迟最低但可能读到旧数据。
本免费体验版限制以下高级功能:
解锁全部功能请使用专业版:mongo-manager-pro
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| MongoDB | 数据库 | 必需 | mongodb.com 官方下载 |
| mongosh | 客户端 | 必需 | 随MongoDB附带 |
| PyMongo | Python驱动 | 可选 | pip install pymongo |
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 配置错误 | 参数缺失或格式错误 | 检查依赖说明中的配置要求 |
| 运行时错误 | 运行环境不满足 | 确认运行环境符合依赖说明 |
| 网络错误 | 连接超时或不可达 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接后执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令,参考国内替代方案 |
{
"success": true,
"data": {
"result": "Mongo管理工具免费版处理结果",
"execution_time": "0.5s",
"metadata": {
"version": "1.0",
"processor": "mongo manager"
}
},
"execution_log": ["解析输入参数", "执行核心处理", "格式化输出结果"],
"error": null
}