如何通过驱动程序在Mongo中建立连接

时间:2018-10-03 09:31:01

标签: node.js mongodb perl

我正在使用的系统使用Mongo中的连接表(inprog数组)来监视和控制系统可用性和并发性。这可以通过精彩的$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(...)

是否有eval以外的其他方法来获取inprog列表,这些列表可从Mongo驱动程序使用?

2 个答案:

答案 0 :(得分:4)

该收藏名称不是真实的收藏;这是一条伪命令,已在SERVER-30181的3.6服务器中删除。您可以改用currentOp命令。

请注意,currentOp最终将不再支持$currentOp聚合阶段。这在使用db.aggregate的Shell中有效,但是驱动程序当前不支持数据库级(与集合级)的聚合管道。 (该功能目前在4.2时代驱动程序的开发路线中。)

答案 1 :(得分:1)

我找到了一种使用db.runCommand()的方法。

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

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

它在Node中也可以使用

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