Я ищу удобный (и эффективный) способ поместить вложенный документ в массив существующего документа в базе данных mongodb с помощью Quarkus. В настоящее время я использую PanacheMongoRepository, но открыт для других предложений.
Мой документ mongodb выглядит так (сильно упрощенно), и я хочу добавить документ в myArray:
{ _id: "123abc...", название: "тест", мойМассив: [ { идентификатор: 1, имя: "sub1", ... }, { идентификатор: 2, имя: "sub2", ... } ] } Первое, что я попробовал, было что-то вроде этого (у меня есть POJO, представляющие документ, а также вложенные документы под «myArray»):
myEntity.getMyArray().add(myNewSubObj); myEntityRepository.update(myEntity); Это работает, но в журналах похоже, что перезаписывается весь документ mongodb. Я предпочитаю просто добавлять в массив один элемент. Я думаю, что для этого может помочь оператор $push. (например, как описано здесь: Обновить документ MongoDB с помощью вложенных массивов вложенных документов)
Если я не ошибаюсь, у меня есть что-то вроде этого, чтобы использовать оператор $push:
myEntityRepository .update(новый документ("$push", новый документ("myArray", новый документ("id", 3) .append("имя", "sub3") .добавить(...) ) )) .where("_id", "123abc..."); Это тоже похоже на возможный путь, но есть ли способ предотвратить все эти команды new Document()? Я думаю, что Panache внутри использует что-то вроде автоматического конвертера (CodecProvider). Могу ли я тоже этим воспользоваться? Или есть еще лучший способ сделать это?
Я уже пробовал это:
Кодек codec = BsonDocument.DEFAULT_CODEC_REGISTRY.get(MyEntity.class); BsonDocument документ = новый BsonDocument(); Писатель BsonDocumentWriter = новый BsonDocumentWriter (док); codec.encode(писатель, myNewSubObj, EncoderContext.builder().build()); Но я получил исключение, поскольку не существует соответствующего поставщика кодеков. Поэтому провайдер для автоматического преобразования не используется.
Есть предложения?
Большое спасибо!
Мобильная версия