2016-07-07 108 views
2

我正在使用MongoDB本机Node.js驱动程序1.4.38。如何使用MongoDB本机Node.js驱动程序运行db.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); 
          db.killOp(op.opid); 


         } 

        }) 
       } 


      }); 

我要杀了长时间运行的操作,但db.killOp是给错误:未定义是不是一个函数。

如何在node.js MongoDB本机驱动程序中运行killOp?

回答

1

与在db.collection('$cmd.sys.inprog')集合上运行查询的方式相同,可以对db.collection('$cmd.sys.killop')集合上的db.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 
        }); 
      } 
     }); 
    } 
}); 
+0

我认为,$ cmd.sys.killop上的findOne函数将获得记录。它将如何杀死手术?不明白。 – rajeshpanwar

+0

与大多数mongo操作一样,查找和取消操作'db.currentOp()'和'db.killOp()'的方法通过访问底层系统集合'$ cmd.sys,使用有线协议操作进行函数调用。 inprog'和'$ cmd.sys.killop'分别与操作ID。因此,通过访问'db.collection('$ cmd.sys.killop')。findOne({'op':op.opid})''中的集合,调用将发出'db.killOp(op.opid) '命令。你真的先试过吗? – chridam

+0

是的。我尝试过这个。 – rajeshpanwar

0

从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. 
         ); } ); 
相关问题