runCommand 的地位
MongoDB 的管理能力大多以「数据库命令」的形式提供,统一通过 db.runCommand({...}) 调用,mongosh 里的很多便捷方法只是对它的封装。理解这层关系的好处是:当某个便捷方法在某版本上不存在,或者驱动没提供对应封装时,仍然可以用命令形式完成同样的操作。
基本信息
| 形式 | db.runCommand({ <命令名>: <参数> })(mongosh 内) |
|---|---|
| 常用命令 | ping / buildInfo / serverStatus / collStats / collMod / currentOp / hello |
| 管理类 | createIndexes、listCollections、dbStats、listDatabases、replSetGetStatus |
| 驱动侧 | 各语言驱动的 db.command() 或 runCommand 等价方法 |
| 权限要求 | 随命令而定,管理类命令通常需要相应角色 |
| 返回结构 | ok 字段为 1 表示成功,其余字段随命令而定 |
典型使用场景
- 连通性探测:ping 检查实例是否响应
- 版本核对:buildInfo 取版本与存储引擎信息,跨版本脚本先确认再断言参数
- 运行状态巡检:serverStatus 采集连接、操作计数与内存指标
- 集合维护:collMod 修改校验器或调整集合选项
- 元数据查询:listCollections、listDatabases 做资产盘点
- 复制集诊断:replSetGetStatus 查看成员角色与延迟
常用命令示例
常用命令示例
db.runCommand({ ping: 1 }) // 连通性探测
db.runCommand({ buildInfo: 1 }).version // 版本信息,跨版本脚本先核对
db.runCommand({ serverStatus: 1 }).connections // 连接与运行指标
db.runCommand({ collStats: "orders" }) // 集合与索引占用
db.runCommand({ listCollections: 1, filter: { name: /^order/ } }) // 元数据查询
db.runCommand({ replSetGetStatus: 1 }).members.map(function (m) { // 复制成员状态
return { name: m.name, state: m.stateStr, lag: m.optimeDate }
})
// 命令失败时先看返回里的 ok 与 errmsg,而不是捕获异常后猜原因常用命令对照
| 命令 | 用途 | 注意点 |
|---|---|---|
| ping | 连通性探测 | 成功返回 ok 为 1,不含其他信息 |
| buildInfo | 版本与构建信息 | 跨版本脚本的前置检查项 |
| serverStatus | 实例运行指标 | 输出较大,按字段取用而不是全量打印 |
| collStats | 集合与索引占用 | 分片集合会向各分片采集 |
| collMod | 修改集合选项与校验器 | 属于变更操作,建议先在测试环境验证 |
| listCollections / listDatabases | 元数据盘点 | 权限不足时结果被过滤,不代表对象不存在 |
命令参数随版本演进:跨版本脚本跑之前先用 buildInfo 确认目标版本,再断言具体参数是否存在,比在报错里逐条试错高效得多。
管理类命令里有不少是变更操作(如 collMod、createIndexes):在生产环境执行前确认影响范围,并保留执行记录便于回滚。