2016-07-07 109 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. 
         ); } ); 
相關問題