You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 03:00:00