# #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"}