Запрос Arrayfilter Mongodb в golang для операции обновления

# #database #mongodb #go #aggregation-framework

Вопрос:

Я хочу выполнить операцию обновления в mongodb. Массив запросов Mongodb состоит из : Я хочу реализовать функцию endexam , которая просто увеличит количество попыток в моем документе учащегося, например, Учащийся состоит []курс, курс состоит []экзамен и экзамен состоит из количества попыток

Запрос :

 db.learner.updateOne(
    {
    "username": "USERNAME",
    },
    {
        $inc : {
            "courses.$[i].exams.$[j].attemptscompleted":1,
        }
    },
    {
        arrayFilters: [
            {"i.coursename": "COURSENAME"}, 
            {"j.examid": "EXAMID"}
        ]
    }
)
 

В golang я беру имя пользователя,имя курса и идентификатор экзамена в качестве параметра.
Вот как выглядит моя функция golang:

 func EndExam(username, coursename, examid string) {
    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{
            Filters: []interface{}{bson.D{
                {Key: "i.coursename", Value: coursename},
                {Key: "j.examid", Value: examid},
            }},
        }).SetReturnDocument(1),
    )

    fmt.Println(res)

}
 

Я получил ошибку: amp;{{9 Ошибка разбора фильтра массива :: вызвана :: Ожидалось одно имя поля верхнего уровня, найдено «i» и » j » [] Не удалось } [] }

Похоже, я что-то напутал с arrayfilter. но я не знаю, как их использовать в таких случаях. Я либо ищу решение, либо лучший способ просмотреть этот запрос в golang

Ответ №1:

Попробуйте это:

 options.FindOneAndUpdate().SetArrayFilters(options.ArrayFilters{
            Filters: []interface{}{
            bson.D{
                {Key: "i.coursename", Value: coursename},
            },
            bson.D{
                {Key: "j.examid", Value: examid},
            },
        })
 

бсон.D — это представление документа. В вашем случае он будет преобразован в :

 {"i.coursename": "COURSNAME", "j.examid": "EXAMID"}