Может ли кто-нибудь помочь с вопросом MongoTemplate? У меня есть структура записи с вложенными массивами, и я хочу обновить конкретную запись в массиве 2-го уровня. Я могу найти подходящую запись достаточно просто, поскольку для пути Set нужны индексы обеих записей массива, а '$' относится только к конечному элементу. Например, если у меня был массив команд, содержащий массив игроков, мне нужно было сгенерировать путь обновления, например:
val query = Query(Criteria.where( "teams.players.playerId").`is`(playerId))
val update = Update()
with(update) {
set("teams.$.players.$.name", player.name)
Это не удается, поскольку «$» можно использовать только один раз для ссылки на индекс в массиве игроков, мне нужен способ сгенерировать эквивалентный «$» для индекса в массиве команд.
Я думаю, что мне нужно использовать отдельный агрегатный запрос, используя что-то вроде этого, но я не могу заставить его работать.
project().and(ArrayOperators.arrayOf( "markets").indexOf("")).`as`("index")
Есть идеи для этого новичка в Монго?
Я использую Mongo 3.6
Для других, кто сталкивается с подобной проблемой, один из вариантов - использовать arrayFilters в UpdateOptions. Но похоже, что mongotemplate весной еще не поддерживает использование UpdateOptions напрямую. Следовательно, что можно сделать:
Sample for document which contain object with arrays of arrayObj (which contain another arrays of arrayObj).
Bson filter = eq("arrayObj.arrayObj.id", "12345");
UpdateResult result = mongoTemplate.getDb().getCollection(collectionName)
.updateOne(filter,
new Document("$set", new Document("arrayObj.$[].arrayObj.$[x].someField"), "someValueToUpdate"),
new UpdateOptions().arrayFilters(
Arrays.asList(Filters.eq("x.id, "12345))
));
Какая у вас версия сервера mongo? Запустите db.version () в оболочке, чтобы вывести версию сервера.