db.hello 是什么
db.hello() 返回当前连接节点的角色与复制集信息:isWritablePrimary 表示它是不是可写主节点,secondary 表示是不是从节点,setName 是复制集名称,primary 是主节点地址,hosts 是可见成员列表,me 是当前节点自己的地址。它是运维排障和脚本自检最常用的手段,可以在实际执行写入前确认请求落到了哪类节点。MongoDB 5.0 起该命令由 isMaster 更名为 hello,isMaster 作为兼容别名保留。
基本信息
| 判断可写 | db.hello().isWritablePrimary |
|---|---|
| 复制集名 | db.hello().setName |
| 主节点地址 | db.hello().primary |
| 成员列表 | db.hello().hosts |
| 自身地址 | db.hello().me |
| 版本变化 | 5.0 起 isMaster 更名为 hello,旧名保留为别名 |
典型使用场景
- 写入前自检:确认当前连接是主节点,避免写请求打到从节点上直接失败
- 初始化脚本:迁移或建索引脚本执行前先判断角色是否符合预期
- 排查复制集拓扑:一次调用就能看到主节点地址与成员清单
- 监控采集:定时读取角色字段,做节点级可用性监控
- 切换演练:主从切换后确认新的主节点是谁、老节点是否变成从节点
常用取值
常用取值
db.hello().isWritablePrimary // true 表示当前节点可写,写入前判这个
db.hello().setName // 复制集名称,未启用复制集时该字段不存在
db.hello().primary // 主节点地址
db.hello().hosts // 可见成员列表
db.hello().me // 当前连接节点自己的地址
db.hello().secondary // true 表示当前是从节点
// 脚本里判断角色(用可写性而不是硬编码字符串更稳)
if (!db.hello().isWritablePrimary) { print("当前不是主节点,跳过写操作") }返回字段读法
| 字段 | 含义 | 读法 |
|---|---|---|
| isWritablePrimary | 是否为可写主节点 | 写入前检查这个字段 |
| secondary | 是否为从节点 | 与上者互斥,理论上有主必有从 |
| setName | 复制集名称 | 未启用复制集时不存在 |
| primary | 主节点地址 | 与 me 比较可判断连的是谁 |
| hosts | 成员列表 | 部分成员不可见时列表会变化 |
| me | 当前节点地址 | 多节点连接串时用来确认落点 |
连到 mongos(分片路由)时执行 hello 得到的是路由层面的信息,与直连 shard 的返回不同,判断节点角色前要先确认连接的到底是哪一类进程。
角色判断建议用「是否可写」而不是判断名字里有没有 primary 这类字符串,字段在版本间改过名,硬编码字符串的脚本迟早要返工。