如何使用MongoDB原生Node.js驱动程序运行db.currentOp()?

3

我似乎找不到一种使用Node.js中的mongodb模块检索数据库当前操作信息的方法。

我尝试了以下代码:

mongodb   = require 'mongodb'
server    = new mongodb.Server 'localhost', 27017
connector = new mongodb.Db 'test', server

connector.open (err, db) ->
    if not err?
        db.admin().command {currentOp: 1}, (err, doc) ->
            if not err?
                console.log doc

当然,没有任何结果。

有人有指针吗?

5个回答

8
从Node MongoDB本机驱动程序直接完成此操作的方法是:
var MongoClient = require('mongodb').MongoClient;

MongoClient.connect('mongodb://127.0.0.1:27017/', function (err, db) {

    if (err) { throw err; }

    db.collection('$cmd.sys.inprog').findOne(function (err, data) {

        if (err) { throw err; }
        console.log(data.inprog);

    });
});

我该如何使用MongoDB原生Node.js驱动程序中的db.killOp(opid)? - rajeshpanwar
1
当我使用上述代码时,似乎MongoClient会添加默认的集合名称。然后它会引发一个错误,说“无效的集合名称:admin.$cmd.sys.inprog”。有人遇到过同样的问题吗? - Shaun Xu
3
我终于找到问题所在了。从邮件线程https://groups.google.com/forum/#!topic/mongodb-user/2BpMd8mlEvI中得知,从MongoDB 3.2开始,客户端不能通过find访问系统集合。现在如果我使用db.command({ currentOp: 1 }),就可以得到返回结果了。 - Shaun Xu

0

使用mongoose实现:

        let db = mongoose.connection.db;
        db.command({ currentOp: 1 }, function (err, result) {
            if (err) {
                console.error(`Agenda :: Kill long mongo queries | Error: ${err}`);
            } else {
                for (let oper in result.inprog) {
                    let op = result.inprog[oper - 0];
                    if (op.secs_running > ENUMS.MONGO_KILL_AFTER_SECONDS && op.op === "query" && !op.ns.startsWith("local")) {
                        console.info(`Agenda :: Kill long mongo queries | Killing opId: ${op.opid} Running over ${op.secs_running}`);
                        db.killOp(op.opid);
                    }
                }
            }
        });

基于gist


0

虽然它是一个在 shell 上的命令,但它并不是一个真正的命令。相反,您需要使用 findOne() 查询 $cmd.sys.inprog 集合。在 MongoDB shell 上,您可以执行以下操作:

db.$cmd.sys.inprog.findOne();

谢谢您提供这些信息!看起来这个功能仍需要在Node.js的本地MongoDB驱动程序中实现... - sprijk
我会问这是否是前进的方式。 - Derick
我该如何使用MongoDB原生Node.js驱动程序中的db.killOp(opid)函数? - rajeshpanwar

0

如果你使用的是 MongoDB 3.2,那么你需要使用 currentOp 命令(详情请参见 db.currentOp 的 shell 定义)。

db.eval("return db.currentOp()",function (err, data) { console.log('currentOp',err,data); });


-2

这似乎可以工作,不考虑Node.js的MongoDB本地驱动程序。

exec = require('child_process').exec

exec '/usr/bin/mongo --quiet --host="localhost:27017" "test" --eval "printjson(db.currentOp())"', (err, stdout) ->
    console.error "#{err.message}" if err?

    console.log JSON.parse stdout

这个功能不应该在驱动程序中实现吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接