$currentOp返回包含活动、休眠操作信息的文档流,以及作为事务一部分持有锁的非活动会话信息。该阶段返回所有操作或会话的文档。要运行$currentOp,需要在admin数据库中使用db.aggregate()。
$currentOp聚合阶段比currentOp命令及其mongosh的辅助方法db.currentOp()更具优势,由于它们都是以单个文档的形式返回结果,因此 其结果集的大小受限于单个文档16MB BSON大小的限制,而$currentOp阶段会返回一个文档流光标,虽然每个操作一个文档且也受16MB BSON的限制,但$currentOp结果集的大小没有限制,另外,聚合管道还能对$currentOp的结果进行任意转换。
语法
{
$currentOp: {
allUsers: <boolean>, idleConnections: <boolean>, idleCursors: <boolean>, idleSessions: <boolean>, localOps: <boolean> } }
allUsers
布尔类型,缺省值为false,决定是否报告所有用户的操作。
- false,
$currentOp只报告运行命令的用户的操作/闲置连接/闲置光标/闲置会话等。 - true,
$currentOp报告所有用户的操作。
权限:
- 对于执行访问控制的独立集和副本集,如果
allUsers: true,则需要inprog权限。 - 对于执行访问控制的分片集群,运行
$currentOp需要inprog权限。
idleConnections
布尔类型,缺省值为false,决定是否报告空闲的连接。如果设置为false则只报告活动的操作,如果设置为true,则报告包括空闲连接的所有操作。
idleCursors
布尔类型,缺省值为false。如果设置为true,则报告“空闲”游标的情况,即游标处于打开状态,且当前getMore操作为非活动状态。
$currentOp.type为"idleCursor"时,则为空闲光标信息;$currentOp.type为"op"且$currentOp.op为"getmore"时,则为当前活动的getMore操作信息。
idleSessions
布尔类型,缺省值为true。
- 如果设置为
true,除活动/休眠操作外,$currentOp还会报告:- 作为事务一部分持有锁的非活动会话。在
$currentOp数据流中,每个非活动会话都显示为一个单独的文档。会话信息中会话ID在lsid字段中,事务在transaction字段中。type为"idleSession时为空闲会话信息。 $currentOp.twoPhaseCommitCoordinator在非活动状态。
- 作为事务一部分持有锁的非活动会话。在
- 如果设置为
false,$currentOp不报告:- 非活动会话。
- 非活动状态的
$currentOp.twoPhaseCommitCoordinator信息。
localOps
布尔类型,如果设置为true,对于运行在mongos的聚合,$currentOp只报告mongos运行在本地的操作。如果设置为false,则报告运行在分片上的操作。
localOps的值对于对于运行在mongod的$currentOp聚合没有影响。
backtrace
布尔类型,决定是否将调用堆栈的信息作为waitingForLatch字段的一部分返回。
- 如果设置为true,
$currentOp的waitingForLatch.backtrace字段将包含调用堆栈信息(如果有调用堆栈信息),如果没有调用堆栈信息,则返回空数组。 - 如果设置为false,
$currentOp将忽略waitingForLatch.backtrace字段。
如果忽略以上参数,$currentOp将使用参数缺省值,如下所示,可以指定一个空文档。
{
$currentOp: {
} }
限制
$currentOp必须是管道的第一个阶段。- 只能运行在
admin数据库 - 对于执行访问控制的独立集和副本集,如果
allUser:true则必须要有inprog权限。 - 对于执行访问控制的分片集群,
inpro权限也是必须的。 $currentOp不能在事务中使用。- 当使用可查询加密时,
$currentOp输出- 输出结果省略了"command"后面的所有字段。
- 输出结果对"command"进行了编辑,只包括第一个元素
$comment和$db。
举例
非活动会话
下面的示例返回作为事务一部分持有锁的非活动会话信息
db.getSiblingDB("admin").aggregate( [
{
$currentOp : {
allUsers: true, idleSessions: true } },
{
$match : {
active: false, transaction : {
$exists: true } } }
] )
阶段1:返回所有活动操作的文档,以及作为事务一部分持有锁的非活动会话的文档。
阶段2:过滤出作为事务一部分持有锁的非活动会话的文档。
也可以使用$currentOp.type来指定过滤条件:
db.getSiblingDB("admin").aggregate( [
{
$currentOp : {
allUsers: true, idleSessions: true } },
{
$match : {
type: "idleSession" } }
] )
返回结果:
副本集
在作为副本集一部分的mongod上运行时:
{
"type" : "idleSession",
"host" : "example.mongodb.com:27017",
"desc" : "inactive transaction",
"client" : "198.51.100.1:50428",
"connectionId" : NumberLong(32),
"appName" : "",
"clientMetadata" : {
"driver" : {
"name" : "PyMongo",
"version" : "3.9.0"
},
"os" : {
"type" : "Darwin",
"name" : "Darwin",
"architecture" : "x86_64",
"version" : "10.14.5"
},
"platform" : "CPython 3.7.1.final.0"
},
"lsid" : {
"id" : UUID("ff21e1a9-a130-4fe0-942f-9e6b6c67ea3c"),
"uid" : BinDat

本文详细介绍了MongoDB聚合阶段的$currentOp,包括语法、限制和多个示例,展示了如何获取活动及非活动会话、连接、游标的信息,特别强调了在不同环境(副本集、分片集群)下的应用。
最低0.47元/天 解锁文章
99

被折叠的 条评论
为什么被折叠?



