目录

  1. 什么是 GridFS
  2. GridFS 的工作原理
  3. GridFS 的数据结构
  4. 使用场景与优势
  5. 常见操作示例(以 MongoDB Shell 为例)
  6. 在编程语言中使用 GridFS(Node.js、Python 等)
  7. 参考资料

什么是 GridFS

GridFS 是 MongoDB 提供的一种用于存储和检索大型文件的机制,它打破了 BSON 文档最大限制(16MB),将文件分割为多个数据块(chunk)后分别存储。它非常适合存储音频、视频、图片、PDF 等大型文件。


GridFS 的工作原理

GridFS 使用两个主要集合来实现文件的分块管理:

  • fs.files:保存文件的元信息,例如文件名、长度、上传时间、MIME 类型等。
  • fs.chunks:保存实际的文件内容,每个文档代表文件的一部分(chunk)。

文件上传后,MongoDB 会自动将文件拆分为多个 chunk(默认每块 255KB),并将这些块存入 fs.chunks 中,同时在 fs.files 中记录索引信息。


GridFS 的数据结构

fs.files 示例:

{
  "_id": ObjectId("5e8c1ec6"),
  "filename": "example.pdf",
  "length": 892345,
  "chunkSize": 261120,
  "uploadDate": ISODate("2025-04-12T10:15:00Z"),
  "md5": "abc123...",
  "contentType": "application/pdf"
}

fs.chunks 示例:

{
  "_id": ObjectId("5e8c1ec8"),
  "files_id": ObjectId("5e8c1ec6"),
  "n": 0,
  "data": BinData(...)
}

  • files_id 关联 fs.files 中的 _id
  • n 表示块的序号
  • data 为二进制数据

使用场景与优势

场景

  • 在线文件存储系统(类似 Google Drive、百度网盘)
  • 需要与文档数据库紧密集成的多媒体内容平台
  • 存储日志文件、数据库快照、导出数据等

优势

  • 文件数据与元信息同存于 MongoDB,无需外部文件系统
  • 轻松实现备份、复制、分片
  • 支持流式读取与写入,节省内存

常见操作示例(以 MongoDB Shell 为例)

上传文件

mongofiles -d gridfs_test put example.jpg

下载文件

mongofiles -d gridfs_test get example.jpg

删除文件

mongofiles -d gridfs_test delete example.jpg

注意:mongofiles 是 MongoDB 自带的命令行工具,需在终端使用。


在编程语言中使用 GridFS(Node.js、Python 等)

Node.js 示例(使用官方 MongoDB Driver)

const { MongoClient, GridFSBucket } = require('mongodb');
const fs = require('fs');

const client = new MongoClient('mongodb://localhost:27017');
await client.connect();
const db = client.db('gridfs_test');

const bucket = new GridFSBucket(db);

fs.createReadStream('./sample.pdf')
  .pipe(bucket.openUploadStream('sample.pdf'))
  .on('finish', () => {
    console.log('文件已上传');
    client.close();
  });

Python 示例(使用 pymongo 和 gridfs 模块)

from pymongo import MongoClient
import gridfs

client = MongoClient('mongodb://localhost:27017')
db = client['gridfs_test']
fs = gridfs.GridFS(db)

with open('example.jpg', 'rb') as f:
    file_id = fs.put(f, filename="example.jpg")
    print("文件已上传,ID 为:", file_id)


参考资料

更多 MongoDB 教程和使用案例,请访问:www.52kanjuqing.com(仅此一次出现)。