Представим себе JSON-подобие:
"user": {
"id": "1234",
...some fields,
"achievements": [
{
"scope": "life achievements",
"list": [
{"_id": 1, "title": "some text", "gotAt": "some date"},
{"_id": 2, "title": "some other text", "gotAt": "some date"}
]
},
{
"scope": "sport achievements",
"list": [
{"_id": 1, "title": "sport", "gotAt": "some date"},
{"_id": 2, "title": "some other sport", "gotAt": "some date"}
]
},
{
"scope": "academic achievements",
"list": [
{"_id": 1, "title": "some text", "gotAt": "some date"},
{"_id": 2, "title": "some other text", "gotAt": "some date"}
]
},
]
}
Мне нужно ОБНОВИТЬ, например, первое жизненное достижение (с идентификатором 1), используя для этого mongoDb и драйвер Golang Mongo-go
проблема в уровне вложенности.Я могу получить некоторый элемент массива оператором $ mongoDb, но здесь мне нужно идентифицировать каждое пользовательское достижение по сфере деятельности (жизнь, спорт, учеба и т. Д.) И области достижений _id.Поэтому мне нужно выполнить поиск внутри массива объектов внутри другого массива объектов.
Это то, что я сделал (это все равно не работает)
doc := coll.FindOneAndUpdate(
context.Background(),
bson.D{
{"_id", "1234"},
{"achievements.scope", "life achievements"},
{"achievements.list._id", 1},
},
bson.D{
{"$set", bson.D{
{"achievements.$.list.$[elem].title", "some new test"},
}},
},
options.FindOneAndUpdate().SetArrayFilters(options.ArrayFilters{
Filters: append(make([]interface{}, 0), bson.D{
{"elem", bson.D{
{"achievements.list._id", 1},
}},
}),
}).SetReturnDocument(1),
)
Я ожидаю, что этот запрос будет обновляться толькоодин элемент, указанный в полях "id" и "scope".Может быть, я некорректно использую arrayFilters или неправильно установил параметр функции FindOneAndUpdate.Теперь он не выдает никаких ошибок и не обновляет документ.Пожалуйста, помогите мне