MongoDB聚合:$currentOp

发布时间:2024年01月24日

$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,$currentOpwaitingForLatch.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"),
      
文章来源:https://blog.csdn.net/superatom01/article/details/135826541
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。