从Java API取消MongoDB查询

时间:2015-06-26 18:05:29

标签: mongodb mongodb-java

启动MongoDB查找或聚合操作后,我希望能够取消它。有时用户想要取消长时间运行的操作并继续其他操作。

我知道可以使用db.killOp()来停止正在运行的操作,但似乎没有一种好方法可以确定要杀死的操作。接受的形式是使用db.currentOp()来查找来自同一客户端并具有相同操作的操作。但由于这是一个Web应用程序,所有操作似乎都来自同一个“客户端”,并且两个不同的用户可能会触发相同的操作。如果一个用户决定取消,我不想无意中杀死错误的那个。

SELECT t1.Tran_Date, t1.Mate_Code, t1.Qty_In, t1.Qty_Out, @b := @b + t1.Qty_In - t1.Qty_Out AS Qty_Balance FROM (SELECT @b := 0) AS dummy CROSS JOIN (SELECT Tran_Date, Mate_Code, SUM(CASE WHEN Tran_Type = 'IN' THEN Tran_Qtyx ELSE 0 END) Qty_In, SUM(CASE WHEN Tran_Type = 'OUT' THEN Tran_Qtyx ELSE 0 END) Qty_Out FROM myTable WHERE Mate_Code = 'MAT001' GROUP BY DATE(Tran_Date)) AS t1 ORDER BY t1.Tran_Date; 返回的每个操作都有一个唯一的currentOp(),但我没有看到将opid映射到从Java API启动的操作的方法。在Java API的同步部分中,当然在查找或聚合完成之前没有信息。但即使在异步API中,也只有结果的回调。

我检查了opid返回的其他字段,似乎没有办法在每个查询上放置我自己的标记或计数器,以便我可以在事后将它们关联起来。如何使用Java API允许用户在操作开始后取消/终止MongoDB查找或聚合操作?

1 个答案:

答案 0 :(得分:2)

目前没有通过Java驱动程序杀死作业的API选项。但是,有一个open issue。正如评论中所提到的,您可以探索使用maxTime作为终止聚合的方法,这种聚合需要很长时间才能完成。