我似乎找不到使用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
当然没有任何结果。
有人有指针吗?
答案 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
这个功能不应该在驱动程序中实现吗?