首页/数据/NoSQL 速查/db.hello 判断节点角色
MongoDB99 条

db.hello 判断节点角色

db.hello() 返回当前节点角色与复制集信息:isWritablePrimary、secondary、setName、primary 等,用于快速确认主从。

NoSQL 速查数据更新于 2026-10-13

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 这类字符串,字段在版本间改过名,硬编码字符串的脚本迟早要返工。

易错点

  • hello 返回字段随版本有增减,脚本取值前先确认目标版本字段名,避免拿到 undefined 当成 false 用
  • 把启动时的一次角色判断结果缓存长期使用:主从切换后角色会变,判断应放在每次写入前
  • 新代码继续用 isMaster:虽然兼容存在,但与新版文档、工具和同事脚本的口径不一致
  • 连接串里填了多个节点时驱动可能连到任一成员,单次 hello 只能代表这一条连接,不代表整条链路的主节点

数据来源与参考

  • MongoDB Manual: db.hello()
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌