使用Go获取MongoDB 5.x以下版本当前操作无结果的问题咨询
问题
使用Go语言调用currentOp命令获取MongoDB 3/4版本的当前操作时,inprog字段始终无结果返回,但MongoDB 5及以上版本执行相同代码能正常得到结果。同一数据库用Java和Compass工具却能获取有效结果,请问原因是什么?
相关代码
var currentOpsResult CurrentOpsOutput err := client.Database("admin").RunCommand(context.TODO(), bson.D{{"currentOp", 1}}).Decode(¤tOpsResult) if err != nil { fmt.Println("Error executing aggregate command:", err) return nil, nil } type CurrentOpsOutput struct { Inprog []FirstBatchItem `json:"inprog"` } type FirstBatchItem struct { Active bool `json:"active"` Client string `json:"client"` ClientMetadata ClientMetadata `json:"clientMetadata"` ConnectionID int `json:"connectionId"` CurrentOpTime time.Time `json:"currentOpTime"` Op string `json:"op"` Type string `json:"type"` Microsecs_running int `json:"microsecs_running"` Desc string `json:"desc"` AppName string `json:"appName"` Host string `json:"host"` Secs_running int `json:"secs_running"` NS string `json:"ns"` EffectiveUsers []EffectiveUser `json:"effectiveUsers"` RunBy []EffectiveUser `json:"runBy"` }
原因及解决方案
- 字段映射标签错误:Go的MongoDB驱动默认使用
bson标签来映射MongoDB返回的字段,而你的结构体用了json标签。MongoDB 3/4版本返回的inprog字段无法被正确映射到结构体的Inprog字段,导致结果为空;MongoDB 5+可能在驱动兼容或字段处理上有宽松逻辑,所以能正常返回。 - 验证方式:可以先将结果解码到
bson.M类型并打印,确认inprog字段确实存在,就能验证是标签映射的问题。
修复方法:把结构体的标签全部替换为bson标签,修改后的代码如下:
type CurrentOpsOutput struct { Inprog []FirstBatchItem `bson:"inprog"` } type FirstBatchItem struct { Active bool `bson:"active"` Client string `bson:"client"` ClientMetadata ClientMetadata `bson:"clientMetadata"` ConnectionID int `bson:"connectionId"` CurrentOpTime time.Time `bson:"currentOpTime"` Op string `bson:"op"` Type string `bson:"type"` Microsecs_running int `bson:"microsecs_running"` Desc string `bson:"desc"` AppName string `bson:"appName"` Host string `bson:"host"` Secs_running int `bson:"secs_running"` NS string `bson:"ns"` EffectiveUsers []EffectiveUser `bson:"effectiveUsers"` RunBy []EffectiveUser `bson:"runBy"` }
修改后Go驱动就能正确映射MongoDB返回的字段,在MongoDB 3/4版本中也能正常获取inprog的结果。
内容的提问来源于stack exchange,提问作者Vaishakh S
相关产品推荐
相关产品推荐

