2016-07-07 6 views
2

MongoDBネイティブNode.jsドライバ1.4.38を使用しています。私が使用して、実行中のすべての操作を持っているMongoDBネイティブNode.jsドライバを使用してdb.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); 
          db.killOp(op.opid); 


         } 

        }) 
       } 


      }); 

:未定義は関数ではありません。

node.js MongoDBネイティブドライバでkillOpを実行するにはどうすればよいですか?

答えて

1

db.collection('$cmd.sys.inprog')コレクションでクエリを実行したのと同じ方法で、db.collection('$cmd.sys.killop')コレクションのdb.killOp()についても同じ操作を行うことができます。この例に

は、トリックを行います:システム収集がもはやさらされているので、以降のMongoDB 3.2から

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.killOp(op.opid)')を呼び出して、 'db.killOp(op.opid) 'コマンド。最初に実際に試しましたか? – chridam

+0

はい。私はそれを試してみました。 – rajeshpanwar

0

を、受け入れ答えは、もはや、動作しません。

代わりに、この操作のコマンドハッシュがあります。これは私の作品:

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. 
         ); } ); 
関連する問題