Course contentsShow
← Databases & SQL
Lesson 1229 of 1,95311. NoSQL and Document ModelsFree lesson

Handling Large File Storage (GridFS)

Store binary blobs that exceed document size limits using chunked storage patterns.

In this lesson, you will learn how to overcome document size limitations when storing massive binary objects by using a chunked storage pattern known as GridFS.

The Limitation

In document databases like MongoDB, every document is subject to a hard size limit (e.g., 16MB). If you try to store a high-resolution video, a large system backup, or a complex scientific dataset, you will quickly hit this wall. Simply "splitting" a file manually into multiple documents can be messy to manage, especially if you need to perform partial reads or stream the content.

The Chunking Solution

GridFS solves this by taking a large binary blob and automatically breaking it into smaller, manageable chunks. Instead of one monolithic document, your database stores two separate collections:

  1. files collection: Contains the file’s metadata (filename, content type, upload date, and total size).
  2. chunks collection: Contains the actual binary data, sliced into pieces (typically 255KB each). Each chunk is stored as a separate document, linked to the main file by a unique files_id.

When you want to retrieve the file, the system reassembles these chunks in the correct sequence based on their index.

Why use this pattern?

  • Efficiency: You can stream a large video file by requesting chunks in order, rather than waiting for the entire multi-gigabyte document to load into memory.
  • Partial Access: If you need to access only a specific portion of a large file (e.g., seeking to the middle of a song), GridFS allows you to fetch only the relevant chunks without scanning the entire file.
  • Scalability: Because each chunk is its own document, you can distribute these pieces across your sharded cluster effectively, preventing any single document from becoming a performance bottleneck.
// Conceptual structure of a chunk in the 'chunks' collection
{
  "_id": ObjectId("..."),
  "files_id": ObjectId("file_metadata_id"),
  "n": 0, // The sequence number of the chunk
  "data": BinData(0, "...") // The actual binary slice
}

By abstracting the complexity of chunking and indexing, GridFS allows your database to handle files of virtually any size while maintaining the flexibility of a document store.

Key Takeaway: GridFS bypasses document size limits by partitioning binary data into indexed, smaller chunks across separate documents, enabling efficient streaming and storage of large files.