我想取消一个发送到mongodb的操作:
我尝试在查询中添加一个$comment,并使用:
db.currentOp({"query.filter.$comment" : "127.0.0.1"})
currentOp输出示例:
(...)
"query" : {
"find" : "collectionName",
"filter" : {
"$comment" : "127.0.0.1",
"field1" : "example of field1 value"
}
(...)
但是,如果查询太大,有很多字段或大字符串,那么mongo db.currentOp()命令就不起作用。
"query" : {
"$msg" : "query not recording (too large)"
}
我知道慢查询可以取消,但我想要做的是杀死用户所做的操作,但我需要将发送到mongodb的opid保存在客户端。
发布于 2020-11-19 13:10:04
当我试图弄清楚同样的事情时,偶然发现了你的问题。经过一些研究,似乎很难做到这一点。
查看Wire Protocol,您可以看到,当执行查询时,客户端将得到的唯一响应是一个OP_REPLY
。但是,这不包含opId
(并且也仅在处理后发送)。
OP_REPLY
中包含的字段包括具有responseTo
属性的标准消息头。此属性的值设置为客户端最初发送到服务器的requestID
值。因为这个值是由客户机生成的( NodeJS驱动程序只使用一个递增整数),所以它与您正在寻找的opId
不同。
识别所执行查询的opId
的惟一方法可能是使用$currentOp
的输出进行一些关联。
https://stackoverflow.com/questions/44315827
复制相似问题