【发布时间】:2014-05-06 01:04:08
【问题描述】:
我对 MongoDB 世界很陌生,我正在使用 Java 驱动程序 (2.12) 连接到 MongoDB 服务器 (2.6)。
是否有取消 MapReduceCommand(或正在进行的 .aggregate() 操作)?我在文档中找不到任何内容。
【问题讨论】:
标签: mongodb mongodb-java
我对 MongoDB 世界很陌生,我正在使用 Java 驱动程序 (2.12) 连接到 MongoDB 服务器 (2.6)。
是否有取消 MapReduceCommand(或正在进行的 .aggregate() 操作)?我在文档中找不到任何内容。
【问题讨论】:
标签: mongodb mongodb-java
我也不确定是否有直接的 API 方法,但与大多数 mongo 操作一样,这些方法实际上只是通过对“系统集合”进行类似的有线协议操作来发挥作用。
所以查找和取消的方法记录在db.currentOp() 和db.killOp() 下。这些都是shell实现方法,它们都在做id访问下面的“系统集合”,分别是$cmd.sys.inprog和$cmd.sys.killop。
具体来说,它们的 shell 实现是:
当前操作:
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);
这就是它的基础。有关如何匹配要取消的操作的更多信息,请参阅列出的文档资源。
【讨论】:
除了先前的答案(这是正确的)之外,还有一种方法可以禁止您的 mapreduce(或实际上任何其他命令)运行超过特定时间。
我发现这非常方便,因为它可以让您积极主动。请注意,这仅在 2.6 之后可用。例如,在这里我要在 0.2 秒后终止我的查找查询。
db.collection.find({
// my query
}).maxTimeMS(200)
查看maxTimeMS 了解更多信息。
【讨论】:
aggregate,它会在此版本中返回一个游标,但它不会适用于 mapReduce。或者严格来说,这是否回答了这个问题。这是一个有价值的评论,但不是真正的答案。