我是MongoDB世界的新手,我使用Java驱动程序(2.12)连接到MongoDB服务器(2.6)。
是否有取消MapReduceCommand(或正在进行的.aggregate()操作)?我在文档中找不到任何内容。
答案 0 :(得分:2)
我不确定是否有直接的API方法,但是像大多数mongo操作一样,这些实际上只是通过对“系统集合”进行类似的线程协议操作来实现。
因此,db.currentOp()
和db.killOp()
记录了查找和取消的方法。这些是shell实现方法,他们只是访问下面的“系统集合”,分别是$cmd.sys.inprog
和$cmd.sys.killop
。
具体来说,他们的shell实现是:
<强> currentOp 强>:
function ( arg ){
var q = {}
if ( arg ) {
if ( typeof( arg ) == "object" )
Object.extend( q , arg );
else if ( arg )
q["$all"] = true;
}
return this.$cmd.sys.inprog.findOne( q );
}
<强> killOp 强>:
function (op) {
if( !op )
throw "no opNum to kill specified";
return this.$cmd.sys.killop.findOne({'op':op});
}
这可以简单地转换为Java代码,因此,例如,在确定要暂停的操作的当前操作编号后,您只需发出如下查询(原谅我从现有Sprint数据代码快速剪切和粘贴) ,无论获取集合对象的实际方法如何):
DBCollection collection = mongoOperation.getCollection("$cmd.sys.killop");
BasicDBObject query = new BasicDBObject("op", opNumber);
DBObject result = collection.findOne(query);
这是它的基础知识。有关如何匹配要取消的操作的详细信息,请参阅列出的文档资源。
答案 1 :(得分:1)
除了上一个答案(这是正确的)之外,这里有一种方法可以禁止你的mapreduce(或实际上任何其他命令)运行超过特定的时间。
我发现这非常方便,因为它可以让你积极主动。请注意,这仅在 2.6 之后才可用。例如,我告诉我在0.2秒后杀死我的查找查询。
db.collection.find({
// my query
}).maxTimeMS(200)
请查看maxTimeMS以获取更多信息。