Проверяет понимание механизма хранения больших файлов в MongoDB через GridFS и его отличий от обычных документов.
MongoDB хранит данные в виде BSON-документов, и размер одного документа ограничен 16 МБ. Если нужно сохранить файл большего размера (видео, изображение, архив, PDF), обычный документ не подойдёт. Для этого и была создана спецификация GridFS — она описывает, как разбивать большой файл на части и хранить их в базе.
GridFS использует две коллекции по умолчанию:
При чтении драйвер собирает чанки по порядку и отдаёт цельный файл. Всё это прозрачно для разработчика: в большинстве драйверов есть готовые API для загрузки и скачивания.
const { MongoClient, GridFSBucket } = require('mongodb');
const fs = require('fs');
const client = new MongoClient('mongodb://localhost:27017');
await client.connect();
const db = client.db('filesdb');
const bucket = new GridFSBucket(db);
// Загрузка файла
fs.createReadStream('./video.mp4')
.pipe(bucket.openUploadStream('video.mp4'))
.on('finish', () => console.log('uploaded'));
// Скачивание файла
bucket.openDownloadStreamByName('video.mp4')
.pipe(fs.createWriteStream('./copy.mp4'));
Для мелких файлов (аватары, иконки) GridFS избыточен — их можно хранить в BSON как Binary или base64. Для больших объёмов медиа обычно выгоднее S3-совместимое хранилище, а в MongoDB держать только ссылку.
Итог: GridFS стоит применять, когда нужно хранить крупные файлы внутри MongoDB и получить единый бэкап, репликацию и доступ через драйвер, но для медиа-тяжёлых систем лучше комбинировать с объектным хранилищем.