如何使用MongoDB本机Node.js驱动程序运行db.killOp()?
问题描述:
我正在使用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?
答
与在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
});
}
});
}
});
答
从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.
); } );
我认为,$ cmd.sys.killop上的findOne函数将获得记录。它将如何杀死手术?不明白。 – rajeshpanwar
与大多数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
是的。我尝试过这个。 – rajeshpanwar