Как организовать хранение локализованных версий документа в Mongo?

Одним из широко используемых подходов для хранения локализованных версий документов в MongoDB является использование вложенных поддокументов или вложенных полей в рамках основного документа. Давайте рассмотрим несколько возможных вариантов организации хранения локализованных версий документа.

1. Хранение локализованных свойств в одном документе:

Здесь каждый документ содержит все доступные локализованные версии свойств, как вложенные поля. Например, для коллекции "books" мы можем использовать следующую структуру документа:

{
   _id: ObjectId("609350e0c6a4d89e4a2b3ed1"),
   title: {
      en: "MongoDB in Action",
      fr: "MongoDB en Action",
      es: "MongoDB en Acción"
   },
   author: {
      en: "Kyle Banker",
      fr: "Kyle Banker",
      es: "Kyle Banker"
   },
   // остальные поля
}

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

2. Хранение локализованных свойств в отдельной коллекции:

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

// Коллекция основных документов
books:
{
   _id: ObjectId("609350e0c6a4d89e4a2b3ed1"),
   title_id: ObjectId("609350e0c6a4d89e4a2b3e00"), // ссылка на локализованную версию названия на английском
   author_id: ObjectId("609350e0c6a4d89e4a2b3e01"), // ссылка на локализованную версию автора на английском
   // остальные поля
}

// Коллекция локализованных версий свойств
localized_properties:
{
   _id: ObjectId("609350e0c6a4d89e4a2b3e00"),
   property: "title",
   lang: "en",
   value: "MongoDB in Action"
},
{
   _id: ObjectId("609350e0c6a4d89e4a2b3e01"),
   property: "author",
   lang: "en",
   value: "Kyle Banker"
},
// остальные локализованные свойства

Такой подход позволяет эффективно управлять локализованными версиями свойств, т.к. они хранятся отдельно и могут быть легко обновлены, добавлены или удалены для каждого документа. Он также экономит место, поскольку локализованные версии свойств хранятся только один раз и могут использоваться многократно для разных документов.

3. Хранение локализованных свойств в массиве в основном документе:

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

{
   _id: ObjectId("609350e0c6a4d89e4a2b3ed1"),
   title: [
      {
         lang: "en",
         value: "MongoDB in Action"
      },
      {
         lang: "fr",
         value: "MongoDB en Action"
      },
      {
         lang: "es",
         value: "MongoDB en Acción"
      }
   ],
   author: [
      {
         lang: "en",
         value: "Kyle Banker"
      },
      {
         lang: "fr",
         value: "Kyle Banker"
      },
      {
         lang: "es",
         value: "Kyle Banker"
      }
   ],
   // остальные поля
}

Этот подход позволяет группировать все локализованные версии свойств в рамках основного документа, что делает его удобным для чтения и обновления. Однако он может быть неэффективным с точки зрения использования памяти и производительности, особенно если у вас много локализованных свойств или языков.

Выбор конкретного подхода зависит от особенностей вашего приложения и его требований к локализации. Подход №1 (хранение локализованных свойств в одном документе) обычно используется, когда у вас небольшое количество локализованных свойств или языков, и вы хотите, чтобы все свойства были доступны в рамках одного документа. Подход №2 (хранение локализованных свойств в отдельной коллекции) и подход №3 (хранение локализованных свойств в массиве в основном документе) обычно используются, когда у вас есть большое количество локализованных свойств или языков, и вы хотите более гибко управлять этими свойствами.