Go使用MongoDB arrayFilters更新嵌套数组出现解析错误如何解决?
MongoDB Go驱动arrayFilters报错解决方案
错误原因
代码核心问题是arrayFilters的结构不符合MongoDB要求:
原生查询中arrayFilters是包含两个独立过滤对象的数组,分别对应标识符i和j的匹配规则。但你在Go代码中将两个规则塞到了同一个bson.D对象中,导致单个过滤对象同时出现i和j两个顶级字段,触发解析错误。
修正后完整代码
import ( "context" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) // EndExam 结束考试,自增对应考试的完成尝试次数 func EndExam(username, coursename, examid string) (*mongo.SingleResult, error) { client, err := connectionHelper.GetMongoClient() if err != nil { return nil, err } collection := client.Database(connectionHelper.DB).Collection(connectionHelper.LEARNER) res := collection.FindOneAndUpdate( context.Background(), bson.D{ {Key: "username", Value: username}, }, bson.D{ {Key: "$inc", Value: bson.D{ {Key: "courses.$[i].exams.$[j].attemptscompleted", Value: 1}, }}, }, options.FindOneAndUpdate(). SetArrayFilters(options.ArrayFilters{ // 拆分为两个独立的过滤对象,分别对应i和j的匹配规则 Filters: []interface{}{ bson.D{{Key: "i.coursename", Value: coursename}}, bson.D{{Key: "j.examid", Value: examid}}, }, }). SetReturnDocument(options.After), // 用官方枚举代替魔数1,可读性更强 ) if err := res.Err(); err != nil { return nil, err } return res, nil }
优化说明
- 补充了返回值的错误校验,避免忽略执行阶段的异常
- 修正了原函数签名和返回值不匹配的语法问题
- 字段名如果和实际文档结构不符(比如你文档描述的是
attemptcount,代码里写的是attemptscompleted),自行调整即可
内容的提问来源于stack exchange,提问作者Pramod
相关产品推荐
相关产品推荐

