启动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查找或聚合操作?
答案 0 :(得分:2)
目前没有通过Java驱动程序杀死作业的API选项。但是,有一个open issue。正如评论中所提到的,您可以探索使用maxTime作为终止聚合的方法,这种聚合需要很长时间才能完成。