Вы должны использовать встроенные документы, если это статические документы или их не более нескольких сотен из-за снижения производительности. Я уже говорил об этой проблеме некоторое время назад. Недавно Ася Камский, которая работает архитектором решений для MongoDB, написала статью об «использовании вложенных документов».
Я надеюсь, что это поможет тем, кто ищет решения или передовой опыт.
Прежде всего, мы должны понять, почему мы хотим это сделать. Обычно я бы посоветовал людям вставлять вещи, которые они всегда хотят вернуть, когда они получают этот документ. Обратной стороной является то, что вы не хотите встраивать в документ то, что не хотите возвращать.
Если вы встроите действие, которое я выполняю, в документ, сначала оно будет отлично работать, потому что все мои действия прямо здесь, и с помощью одного чтения вы можете вернуть все, что вы, возможно, захотите мне показать: "вы недавно нажали на это и здесь ваши последние два комментария "но что происходит через шесть месяцев, а меня не волнуют вещи, которые я делал давным-давно, и вы не хотите показывать их мне, если я специально не пойду искать какую-нибудь старую деятельность?
Во-первых, вы в конечном итоге будете возвращать все больший и больший документ и заботиться о все меньшей и меньшей его части. Но вы можете использовать проекцию, чтобы вернуть только часть массива, настоящая проблема заключается в том, что документ на диске станет больше, и он все равно будет прочитан, даже если вы собираетесь вернуть только часть его конечному пользователю, но поскольку моя деятельность не прекращается, пока я активен, документ будет продолжать расти и расти.
Наиболее очевидная проблема с этим состоит в том, что в конечном итоге вы достигнете предела документа в 16 МБ, но это совсем не то, о чем вам следует беспокоиться. Документ, который постоянно растет, будет нести все более высокие затраты каждый раз, когда его необходимо перемещать на диск, и даже если вы предпримете шаги для смягчения последствий фрагментации, ваши записи в целом будут излишне длинными, что повлияет на общую производительность всего вашего приложения.
Вы можете сделать еще одну вещь, которая полностью убьет производительность вашего приложения, и это проиндексировать этот постоянно увеличивающийся массив. Это означает, что каждый раз, когда документ с этим массивом перемещается, количество записей индекса, которые необходимо обновить, прямо пропорционально количеству индексированных значений в этом документе, и чем больше массив, тем больше будет это число. быть.
Я не хочу, чтобы это пугало вас от использования массивов, когда они хорошо подходят для модели данных - они являются мощной функцией модели данных базы данных документов, но, как и все мощные инструменты, ее нужно использовать в правильных обстоятельствах. и его следует использовать с осторожностью.