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

时间:2013-08-06 10:41:29

标签: node.js mongodb

我似乎找不到使用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 个答案:

答案 0 :(得分:6)

直接从节点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);

    });
});

答案 1 :(得分:1)

虽然它是shell上的命令,但它不是真正的命令。相反,您需要使用$cmd.sys.inprog查询findOne()集合。在MongoDB shell上,你可以这样做:

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

答案 2 :(得分:0)

您需要在MongoDB 3.2上使用currentOp命令(有关详细信息,请参阅db.currentOp的shell定义)。

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

答案 3 :(得分: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

答案 4 :(得分:-1)

这似乎有效,无视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

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