Working with GridFS

1. Understanding GridFS Architecture

CollectionPurpose
fs.filesFile metadata (one doc per file)
fs.chunksBinary chunks (default 255KB each)
Indexfs.chunks: {files_id:1, n:1} unique
When to useFiles > 16MB OR need stream access to part of file

2. Uploading Files

APIMethod
CLImongofiles put report.pdf
Driver (Node)bucket.openUploadStream(filename, {metadata})
JavagridFSBucket.uploadFromStream(filename, in)
const bucket = new GridFSBucket(db);
fs.createReadStream("./report.pdf").pipe(bucket.openUploadStream("report.pdf", { metadata: { owner: "alice" } }));

3. Downloading Files

MethodDetail
openDownloadStream(id)By _id
openDownloadStreamByName(name)By filename (latest revision)
CLImongofiles get report.pdf

4. Listing Files

MethodDetail
bucket.find(filter)Cursor over fs.files
CLImongofiles list

5. Deleting Files

MethodEffect
bucket.delete(id)Removes file metadata + all chunks
CLImongofiles delete report.pdf

6. Using GridFS with Language Drivers

DriverClass / Module
Node.jsGridFSBucket
Python (PyMongo)gridfs.GridFSBucket
Javacom.mongodb.client.gridfs
Gomongo.GridFSBucket
.NETGridFSBucket<TFileId>

7. Setting Chunk Size

OptionDefault
chunkSizeBytes261120 (255 KB)
Range1 byte → 16MB-1
Trade-offLarger = fewer chunks; smaller = better streaming

8. Querying GridFS Files Collection

FieldDescription
_idFile id
lengthBytes
chunkSizePer-chunk bytes
uploadDateDate
filenameName
metadataUser-defined

9. Storing Metadata with Files

AspectDetail
metadata fieldAny subdocument
IndexableCreate indexes on metadata.* for search
Examplesowner, contentType, tags, checksum

10. Handling Large File Storage

TipEffect
Stream upload/downloadAvoid loading entire file in memory
Parallel readsRange download by chunk index
AlternativeS3/Blob storage + GridFS only for embedded use case

11. Using GridFS for Binary Data

Use caseWhy GridFS
Files > 16MBBSON doc limit
Partial readsChunk-level access
Replicated filesSame replication guarantees as data
Transactional with metadataFiles live in same DB