MongoDB 是一种 NoSQL 数据库,它使用文档储存方式来存储数据。然而在实际应用中,我们可能需要在数据库中储存那些大于 16 MB 的文件,如图像、音频、视频等等。这时候我们就要用到 MongoDB 的 GridFS。
GridFS 简介
GridFS 是 MongoDB 的一种文件储存方式,它能够处理存储大文件的情况。GridFS 将大文件分割成若干个 Chunk,每个 Chunk 的默认大小为 255 KB,然后将每个 Chunk 数据以二进制形式存储在一个文件集合中。同时,GridFS 使用一个元数据集合保存文件的元数据信息,例如文件名、上传时间等等。
GridFS 可以看作是在 MongoDB 上的一层抽象,它提供了类似于文件操作的 API,例如上传文件、下载文件等等。但是不同于传统的文件系统,GridFS 会将大文件进行切割和储存,并且给每个块附加元数据信息。
GridFS 的应用
上传文件
GridFS 的上传文件需要分成两个步骤:
- 将文件分块并储存到集合中
- 将文件的元数据信息储存到元数据集合中
下面是一个简单的 Node.js 示例:
// javascriptcn.com 代码示例 const { MongoClient } = require('mongodb'); const fs = require('fs'); const uri = "mongodb+srv://<user>:<password>@cluster0.mongodb.net/test?retryWrites=true&w=majority"; const client = new MongoClient(uri, { useNewUrlParser: true }); const fileName = "example.txt"; async function uploadFile() { try { await client.connect(); const database = client.db('test'); const bucket = new mongodb.GridFSBucket(database); const writestream = bucket.openUploadStream(fileName); const readStream = fs.createReadStream(__dirname + '/' + fileName); await readStream.pipe(writestream); console.log(`Uploading file ${fileName} completed`); } catch (err) { console.error(err); } finally { client.close(); } } uploadFile();
下载文件
GridFS 的下载文件同样需要分成两个步骤:
- 通过文件 ID 查询该文件对应的块的元数据信息
- 将块读出并合并成原始文件数据
下面是一个简单的 Node.js 示例:
// javascriptcn.com 代码示例 const { MongoClient } = require('mongodb'); const fs = require('fs'); const uri = "mongodb+srv://<user>:<password>@cluster0.mongodb.net/test?retryWrites=true&w=majority"; const client = new MongoClient(uri, { useNewUrlParser: true }); const fileName = "example.txt"; const fileId = new mongodb.ObjectId("<file_id>"); async function downloadFile() { try { await client.connect(); const database = client.db('test'); const bucket = new mongodb.GridFSBucket(database); const options = { _id: fileId }; const downloadStream = bucket.openDownloadStreamByName(fileName, options); downloadStream.pipe(fs.createWriteStream(__dirname + '/' + fileName)); downloadStream.on('end', () => { console.log(`Downloading file ${fileName} completed`); }) } catch (err) { console.error(err); } finally { client.close(); } } downloadFile();
GridFS 的优势
对比传统的文件系统,GridFS 有以下几个优势:
- 处理大文件快速,因为 GridFS 储存的是将文件拆分成若干个块的数据,这些块都是以 255 KB 的大小进行存储的。多个节点可以同时与数据库通信,这样就可以更快地访问数据库。
- 巨大的可扩展性,因为 GridFS 可以在不同的节点上同时运行。
- 更容易管理和部署,因为 MongoDB 可以作为 SaaS 提供,并且兼容大量的技术栈,如 JavaScript、Java、Python 等等。
- 更安全,因为 MongoDB 的安全性相对于传统的文件系统会更高。
总结
如果你需要在 MongoDB 中管理和储存大文件,GridFS 是一个不错的选择。相比于传统的文件系统,它提供了更好的可扩展性和更好的安全性。本文介绍了 GridFS 的原理、Node.js 示例及其优势,希望能对开发者们有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65841064d2f5e1655ded8e3c