Как вставить элемент в поле коллекции в MongoDB с помощью масштабируемых данных Spring? - PullRequest
0 голосов
/ 08 мая 2020

Предположим, у нас есть коллекция MongoDB под названием Threads, в которой есть поле типизированной коллекции для ответов на исходное сообщение.

Когда пользователь нажимает на ответ, мы хотели бы создать новый экземпляр сообщения и добавить его в поле ответов. Это легко сделать так:

var thread = threadRepository.findById(threadId);
thread.getReplies().add(post);
threadRepository.save(thread);

Но возникает вопрос, масштабируемо ли это решение? Что, если в этой беседе будет 1 миллион ответов?

Мой главный вопрос: Будут ли они все загружены в память?

Если да, разве не будет напрасной тратой, если все, что мы хотим сделать, это создать новый ответ? Какое рекомендуемое решение?

1 Ответ

1 голос
/ 11 мая 2020

Если все ответы вложены в документ thread, то да, они будут загружены в память, если вы явно не укажете, какие поля загружать через @Query(fields=...)

Чтобы изменить документ без при необходимости загрузки его в память рассмотрите возможность обновления вместо операции замены.

Update update = new Update().push("replies", post);
template.updateFirst(query(where("id").is(thread.id)), update, Thread.class)

С помощью $push можно добавить элемент в массив. Дополнительные сведения см. В справочнике MongoDB документации .

В случае, если предполагается потенциально хранить миллионы ответов таким образом, сохраните хотя бы максимальный размер документа ограничение и рассмотрите возможную стратегию загрузки.

...