如何使用MongoDB本地Node.js驱动程序运行db.killOp()?
我正在使用MongoDB本地Node.js驱动程序1.4.38。
我已经得到所有运行操作使用:
var maxSecsRunning = 2; db.collection('$cmd.sys.inprog').findOne(function (err, data) { if (err) { throw err; } if (data && data.inprog) { data.inprog.forEach(function (op) { console.log("Record", op); if (op.secs_running > maxSecsRunning && op.op == "query" && !op.ns.indexOf("local") > -1) { console.log("Killing opId: " + op.opid + " running for over secs: " + op.secs_running); db.killOp(op.opid); } }) } });
我想杀死长时间运行的操作,但db.killOp给出的错误:undefined不是一个函数。
我如何在node.js MongoDB本地驱动程序中运行killOp?
与在db.collection('$cmd.sys.inprog')
集合上运行查询的方式相同,您可以对db.collection('$cmd.sys.killop')
上的db.killOp()
执行相同的db.killOp()
db.collection('$cmd.sys.killop')
集合。
以下这个例子将会做到这一点:
var maxSecsRunning = 2; db.collection('$cmd.sys.inprog').findOne(function (err, data) { if (err) throw err; if (data && data.inprog) { data.inprog.forEach(function (op) { console.log("Record", op); if (op.secs_running > maxSecsRunning && op.op == "query" && !op.ns.indexOf("local") > -1) { console.log("Killing opId: " + op.opid + " running for over secs: " + op.secs_running); // same thing as db.killOp(op.opid) db.collection('$cmd.sys.killop') .findOne({ 'op': op.opid }, function (err, data) { if (err) throw err; // do something with the result }); } }); } });
从MongoDB 3.2开始,接受的答案将不再起作用,因为系统集合不再暴露。
相反,您有一个命令哈希此操作。 这适用于我:
db.command({currentOp:1}) .then( result => { if( result && result.inprog ) { result.inprog.forEach( item => { if( // some condition ) { db.command( {killOp: 1, op: item.opid} ); } }); } } ) .catch( err => { // don't forget to handle errors. ); } );