db.serverStatus().connections.current 仅统计所有 TCP 连接数(含未鉴权、内部、半开连接),不反映真实活跃鉴权连接;需用 db.currentOp({ "user": { $ne: null }, "active": true, "secs_running": { $gt: 0 }, "internal": { $ne: true } }) 结合权限与云环境特性综合判断。

直接看 db.serverStatus().connections.current,但这个值不区分是否已鉴权——它只统计所有 TCP 连接数,包括未完成认证的、内部连接、甚至失败握手残留的连接。
为什么 serverStatus().connections 不能反映“活跃鉴权连接”
该字段返回的是 WiredTiger 层面上的连接计数,本质是 socket 句柄数量,和用户认证状态无关。比如:
- 一个客户端连上来但还没发
authenticate命令,current就已 +1; - mongos 节点到 shard 的内部连接也计入
current; - 某些驱动(如旧版 Node.js driver)在重连时可能短暂留下半开连接,
current上升但无实际用户会话。
所以仅靠 connections.current 无法回答“当前有多少个已成功登录、正在执行操作的用户连接”。
currentOp 是更接近真实鉴权连接的入口
要定位真正完成认证、有用户名、正在干活的连接,得查 db.currentOp() 并过滤条件:
- 必须带
{ $all: true }才能看到非本节点发起的操作(否则只返回当前 mongod/mongos 自身的操作); - 关注
client字段(IP:port)、user字段(认证后的用户名/数据库对)、secs_running(是否还在跑); - 排除
op: "none"或active: false的条目,它们多是空闲连接或已完成操作的残留; - 注意
internal: true的连接(如复制集心跳、config server 同步),这些不是用户连接。
示例命令:
db.currentOp({
"user": { $ne: null },
"active": true,
"secs_running": { $gt: 0 },
"internal": { $ne: true }
})
返回结果里每一条基本对应一个“活跃鉴权连接”。
权限不足时 currentOp 查不到用户信息
如果执行 db.currentOp() 返回的 user 字段全是空,或报错 not authorized,说明当前账号没权限读取操作上下文。需授予 inprog 或 clusterMonitor 角色:
-
db.grantRolesToUser("your_user", ["inprog"])—— 最小权限,只读当前操作; -
db.grantRolesToUser("your_user", ["clusterMonitor"])—— 更宽泛,含inprog和serverStatus等; - 注意:admin 数据库下操作,且角色需在
admin库中授予。
云厂商实例要注意连接来源混淆
阿里云、腾讯云等托管 MongoDB 实例中,currentOp 里常出现大量 client: "127.0.0.1:xxxx",这其实是代理层(如 mongos 或管控组件)转发的连接,真实客户端 IP 被隐藏。此时:
- 不能单靠
client字段判断终端数量; - 需配合云平台提供的 API,如腾讯云的
DescribeClientConnections,或阿里云 DMS 中的“连接分析”页; - URI 中若带
&maxPoolSize=,实际活跃连接数通常远低于connections.current,因为连接池复用严重。
真正难判断的,从来不是“有多少连接”,而是“哪些连接属于谁、干了什么、卡在哪”。serverStatus().connections 只是水位线,currentOp 才是探针——但探针得插对地方、还得有权限拧紧螺丝。


















