Mongoose
Тема дорожной карты · Node.js
mongoose — это библиотека Object Document Mapper (ODM) для Node.js, предоставляющая основанную на схемах абстракцию поверх MongoDB и упрощающая моделирование данных приложения в среде выполнения JavaScript. С помощью mongoose разработчики определяют схемы, задающие типы данных, правила валидации и значения по умолчанию для документов перед их сохранением, что привносит уровень типовой безопасности в MongoDB, недостижимый с нативным драйвером. Npm-пакет mongoose поддерживает middleware-хуки (pre и post), виртуальные свойства, populate для разрешения ссылок и цепочки запросов — всё это ускоряет серверную разработку, сокращая объём шаблонного кода. В TypeScript-проектах mongoose предоставляет обобщённые параметры типов и декларации от сообщества @types/mongoose, благодаря чему модели несут полную информацию о типах TypeScript от определения до результата запроса. Для высокопроизводительных приложений Node.js пул соединений mongoose, «тощие» запросы (lean queries) и управление индексами являются важными аспектами производительности, непосредственно влияющими на пропускную способность.
Как это работает
Mongoose использует driver-библиотеки: pg — для PostgreSQL, mysql2 — для MySQL, better-sqlite3 — для SQLite (sync API, быстрый), mongodb — для MongoDB, redis/ioredis — для Redis. ORM сверху: Prisma (TypeScript-first, schema-based), Drizzle (TS-типизированный SQL DSL), Sequelize (зрелый классический), TypeORM (декораторный). Connection pooling важен в production — никогда не открывайте соединение на запрос без pool.
Когда применять
Prisma или Drizzle — для новых TypeScript-проектов: type-safety + миграции чисто интегрированы. Сырой pg + SQL — когда запросы тонко настроены или ORM мешает. SQLite (better-sqlite3) — для маленьких single-host приложений и embedded; удивительно мощный, проще в эксплуатации. Миграции всегда через тул (Prisma migrate, drizzle-kit, knex); не правьте production-схему руками.
Типичные ошибки
Ловушки Mongoose: SQL-инъекции из конкатенации строк (параметризованные запросы — есть у каждого драйвера); утечка соединений (важны размер pool + idle timeout); N+1 запросов от наивного ORM (eager-load явно); транзакции, оставленные открытыми из-за early return (async + try/finally); долгие запросы держат row-локи. Slow-query логирование — с самого начала.