MongoDB GridFS 学习笔记

什么是 GridFS?

GridFS 是 MongoDB 提供的一个用于存储大文件的协议。在传统的 MongoDB 中,文档的大小限制为 16 MB,而 GridFS 允许我们存储超过该限制的文件,例如视频、音频等。

GridFS 实现文件存储的方式是将文件分成多个块(chunk),存储到两个集合中:fs.filesfs.chunksfs.files 中存储了文件的元数据(如文件名、大小、上传日期等),而 fs.chunks 中存储了文件的实际内容块。

如何使用 GridFS?

安装 GridFS 驱动

安装 GridFS 驱动需要使用 npm 包管理器,具体命令如下:

Copy Code
npm install mongodb

连接数据库

在代码中连接 MongoDB 数据库的方法跟传统的 MongoDB 操作一样,不再赘述。

存储文件

下面的代码演示了如何将本地的文件存储到 GridFS 中:

javascriptCopy Code
const fs = require('fs'); const mongodb = require('mongodb').MongoClient; // 连接 MongoDB 数据库 mongodb.connect('mongodb://localhost:27017', { useNewUrlParser: true }, (err, client) => { if (err) throw err; const db = client.db('mydb'); // 读取本地文件 const filePath = '/path/to/file.ext'; const fileContent = fs.readFileSync(filePath); // 在 GridFS 中存储文件 const bucket = new mongodb.GridFSBucket(db); const uploadStream = bucket.openUploadStream('file.ext'); uploadStream.write(fileContent); uploadStream.end(); console.log('文件上传成功'); });

下载文件

下面的代码演示了如何从 GridFS 中下载文件:

javascriptCopy Code
const fs = require('fs'); const mongodb = require('mongodb').MongoClient; // 连接 MongoDB 数据库 mongodb.connect('mongodb://localhost:27017', { useNewUrlParser: true }, (err, client) => { if (err) throw err; const db = client.db('mydb'); // 在 GridFS 中查找文件 const bucket = new mongodb.GridFSBucket(db); const downloadStream = bucket.openDownloadStreamByName('file.ext'); // 将文件保存到本地 const filePath = '/path/to/file.ext'; const writeStream = fs.createWriteStream(filePath); downloadStream.pipe(writeStream); writeStream.on('close', () => { console.log('文件下载成功'); }); });

示例:存储和下载图片

下面我们用一个简单的示例,演示如何使用 GridFS 存储和下载一张图片。

存储图片

javascriptCopy Code
const fs = require('fs'); const mongodb = require('mongodb').MongoClient; const path = require('path'); // 连接 MongoDB 数据库 mongodb.connect('mongodb://localhost:27017', { useNewUrlParser: true }, (err, client) => { if (err) throw err; const db = client.db('mydb'); // 读取本地图片文件 const filePath = path.join(__dirname, 'image.jpg'); const fileContent = fs.readFileSync(filePath); // 在 GridFS 中存储图片 const bucket = new mongodb.GridFSBucket(db); const uploadStream = bucket.openUploadStream('image.jpg'); uploadStream.write(fileContent); uploadStream.end(); console.log('图片上传成功'); });

下载图片

javascriptCopy Code
const fs = require('fs'); const mongodb = require('mongodb').MongoClient; const path = require('path'); // 连接 MongoDB 数据库 mongodb.connect('mongodb://localhost:27017', { useNewUrlParser: true }, (err, client) => { if (err) throw err; const db = client.db('mydb'); // 在 GridFS 中查找图片 const bucket = new mongodb.GridFSBucket(db); const downloadStream = bucket.openDownloadStreamByName('image.jpg'); // 将图片保存到本地 const filePath = path.join(__dirname, 'image_download.jpg'); const writeStream = fs.createWriteStream(filePath); downloadStream.pipe(writeStream); writeStream.on('close', () => { console.log('图片下载成功'); }); });

总结

本文简单介绍了 MongoDB GridFS 的使用方法,并给出了一个存储和下载图片的示例。