intermediate

Documents

Моделируйте aggregate-shaped JSON documents, где locality, nesting и update size соответствуют product flow.

Документ MongoDB — это BSON-запись, обычно один JSON-образный aggregate, который приложение читает или обновляет целиком. Хороший дизайн начинается с access patterns: какие поля читаются вместе, как растут вложенные массивы и насколько велик один write.

					// Агрегат заказа: один read отдаёт checkout summary
{
  _id: ObjectId("..."),
  customerId: "c_12",
  status: "paid",
  items: [{ sku: "A1", qty: 2, price: 19.99 }],
  totals: { subtotal: 39.98, tax: 3.2 },
  createdAt: ISODate("2026-06-15T10:00:00Z")
}
				

| Задача | Рычаг в документе | |--------|-------------------| | Локальность чтения | Встраивать данные, читаемые вместе | | Конкуренция записи | Выносить горячие поля в отдельные docs | | Рост | Ограничивать массивы; архивировать историю | | Дрейф схемы | Валидация в приложении + опционально JSON Schema |

`_id` неизменяем; natural keys — только если стабильны. Имена полей и типы должны быть предсказуемы для индексов и aggregation.

На интервью: объясните, почему сформировали один документ, а не много строк, и назовите компромисс read/update.

Типовые ошибки: неограниченные массивы внутри документа; смешивание несвязанных сущностей «потому что Mongo schemaless»; документы близко к лимиту 16 MB; перезапись всего документа ради мелкого поля, когда помогло бы разделение.

Компромисс — между локальностью чтения и усилением записи: глубокий embedding ускоряет reads, но усложняет конкурентные updates и рост документа.

Чеклист:

  • Назовите доминирующие read и write paths.
  • Покажите пример aggregate-shaped документа.
  • Объясните nesting vs split по contention и росту.
  • Упомяните лимиты BSON и владение валидацией.