代码之家  ›  专栏  ›  技术社区  ›  ojosilva

如何通过驱动程序获取Mongo中的连接

  •  1
  • ojosilva  · 技术社区  · 6 年前

    我工作的系统使用连接表( inprog array)用于监控系统的可用性和并发性。这是用美妙的 $cmd.sys.inprog 收集。

    您可以从 mongo 客户:

    db.getCollection('$cmd.sys.inprog').findOne({ $all: 1 }).inprog
    

    使用Perl驱动程序,运行该命令的唯一方法是:

    $db->eval( q{ db.getCollection('$cmd.sys.inprog').findOne({ $all: 1 }) } )->{ inprog };
    

    但是现在 eval 已弃用,正在我们的Mongo日志中生成大量弃用警告。

    以下替代方法无法从Perl驱动程序中工作:

    $db->get_collection('$cmd.sys.inprod')->find_one({ '$all': 1 })->{inprog};
    # fails with "Invalid collection name"
    

    既不是来自node mongo驱动程序,所以它不仅仅是Perl驱动程序:

    db.collection('$cmd.sys.inprog').findOne({$all:1});
    # fails with invalid connection name just the same
    

    而且,我找不到 $db->run_command(...) 这样就可以了。

    有别的办法吗 埃瓦 得到 引爆 是否列出可以从Mongo驱动程序中使用的列表?

    2 回复  |  直到 6 年前
        1
  •  4
  •   xdg    6 年前

    该集合名称不是真正的集合;它是一个伪命令,已在3.6服务器中根据 SERVER-30181 . 你可以使用 currentOp 改为命令。

    请注意,currentOp最终会离开,转而支持 $currentOp 聚合阶段。这在shell中工作使用 db.aggregate 但驱动程序目前不支持数据库级(vs集合级)聚合管道。(该功能目前在4.2时代驱动程序的路线图上。)

        2
  •  1
  •   ojosilva    6 年前

    我找到了一个办法 db.runCommand() .

    $client->get_database('admin')->run_command([ 'currentOp' => 1, '$all' => 1 ])->{inprog};
    

    基本上, currentOp 命令将接收命令选项 $all: 1 这将解决与上一个集合相同的调用。

    它也在节点中工作:

    const db = await mongo.connect('mongodb://localhost:27017/admin');
    db.command({ "currentOp": true, $all: 1 });