如何使用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. ); } );