MongoDB(Java):如何取消map-reduce(或聚合)

时间:2014-05-06 01:04:08

标签: mongodb mongodb-java

我是MongoDB世界的新手,我使用Java驱动程序(2.12)连接到MongoDB服务器(2.6)。

是否有取消MapReduceCommand(或正在进行的.aggregate()操作)?我在文档中找不到任何内容。

2 个答案:

答案 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以获取更多信息。