Использование Spring MongoTemplate для обновления вложенных массивов в MongoDB

Может ли кто-нибудь помочь с вопросом 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? Запустите db.version () в оболочке, чтобы вывести версию сервера.

s7vr 16.04.2018 01:22

Я использую Mongo 3.6

hexkid 16.04.2018 08:44
1
2
1 339
1

Ответы 1

Для других, кто сталкивается с подобной проблемой, один из вариантов - использовать 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))
                    ));

Другие вопросы по теме