Что такое GridFS в MongoDB
Что проверяют
Знаете ли вы ограничение MongoDB на размер документа и что делать, когда файл в него не помещается. За вопросом стоит навык поважнее: умение сказать, что хранить файлы в базе обычно не лучший выбор, и объяснить, когда он всё же оправдан.
Как отвечать
Документ в MongoDB ограничен шестнадцатью мегабайтами. GridFS это соглашение драйвера поверх обычных коллекций, а не отдельный движок хранения: файл режется на чанки (по умолчанию около четверти мегабайта) и складывается в коллекцию чанков, а метаданные (имя, длина, размер чанка, дата, произвольное поле metadata) в коллекцию файлов. Чтение собирает куски по уникальному индексу из идентификатора файла и порядкового номера.
В Node главный аргумент за GridFS это потоковый интерфейс драйвера: файл не поднимается в память целиком, а отдаётся кусками, в том числе диапазоном.
const bucket = new GridFSBucket(db, { bucketName: "avatars" });
fs.createReadStream(src).pipe(bucket.openUploadStream(name, { metadata: { userId } }));
bucket.openDownloadStreamByName(name, { start, end }).pipe(res);Когда оправдано: нет отдельного объектного хранилища, нужны единые резервная копия и репликация вместе с данными, доступ к файлу определяется правами из той же базы. Когда нет: обычная раздача статики, где объектное хранилище с CDN дешевле и быстрее.
Где спотыкаются
Считают GridFS ускорителем. Он ничего не ускоряет: чанки идут через тот же движок и вытесняют из кэша горячие рабочие данные, так что отдача файлов начинает мешать основным запросам.
Ждут частичного обновления. Файл неизменяемый, правка это новая загрузка, и старую версию нужно удалять самому, иначе чанки копятся мёртвым грузом.
Тащат GridFS к любому файлу. Картинка на пару мегабайт спокойно лежит в обычном документе бинарным полем, GridFS начинается там, где документ уже не вмещает содержимое.