什么是 GridFS?
GridFS 是 MongoDB 中用于存储和检索大文件的一种机制,它将大文件分成多个 chunks(块)存储在 MongoDB 中的多个 document 中,利用 MongoDB 自身的复制和分片功能实现文件的高可用和高并发访问。
相比较于传统的存储大文件的方法,GridFS 有以下几个优势:
- 支持分布式存储,解决单机存储瓶颈;
- 数据自动分块,无需手动处理;
- 支持元数据存储,方便查询和管理文件信息。
如何使用 GridFS?
下面将通过一个实际的例子来介绍如何使用 GridFS 来管理文件。假设我们有一个网站需要用户上传附件,同时还需要展示每个上传的附件的具体信息,如文件名、文件大小、上传时间等。
1. 安装依赖
要使用 GridFS,首先需要安装 mongodb 和 GridFS 的 Node.js 驱动官方包 mongodb
:
npm install mongodb --save
2. 连接 MongoDB
在使用 GridFS 之前,需要先连接 MongoDB:
-- -------------------- ---- ------- ----- - ----------- - - ------------------ ----- --- - --------------------------- ----- ------ - --- ---------------- - ------------------- ---- -- ----- -------- --------- - --- - ----- ---------------- ---------------------- -- --------- - ----- ----- - ------------------ - - ---------
这里使用了 Node.js 对 MongoDB 的官方包 mongodb
,使用 MongoClient
来连接 MongoDB。
3. 添加文件
使用 GridFS 添加文件的过程非常简单,只需要使用 GridFS 的 API bucket.openUploadStream
来打开一个可写的流,然后将数据写入流中即可。同时可以通过 options
参数来指定一些元数据,如文件名、文件类型等。
-- -------------------- ---- ------- ----- - ------------ - - ------------------ ----- ------ - --- ------------------------------- ----- -------- ------------- - ------ --- ----------------- ------- -- - ----- ------------ - -------------------------------------- - --------- - ------------ -------------- ----- ---------- ----------- --- ------ - -- ------------------------ ------- ------------------------- -- -- - ----------------------------------- -- ------------------------------ -- -
这里的 file
参数是一个包含文件本身和文件元数据的对象,需要使用 Node.js 的流 stream
来处理文件的读取和写入。
当文件写入完成时,返回的是该文件的 ObjectID,可以将其保存到数据库中以备查询和管理。
4. 获取文件
与添加文件类似,通过 GridFS 获取文件也非常简单,只需要使用 bucket.openDownloadStream
方法来打开一个可读的流,然后将流输出到客户端即可。
async function getFile(id, res) { const downloadStream = bucket.openDownloadStream(id) downloadStream.pipe(res) }
这里的 id
参数是需要获取的文件的 ObjectID,res
是客户端的响应对象。
5. 查询文件元数据
通过 GridFS 添加的文件会自动包含一些元数据信息,这些信息可以通过查询 GridFS 中的 files
collection 来获得。如下是一个查询文件元数据的示例:
async function getFileMetadata(id) { const metadata = await client.db('test').collection('fs.files').findOne({ _id: new ObjectId(id) }) return metadata }
这里的 _id
是文件的 ObjectID,需要将其转换为 MongoDB 中的 ObjectId
类型。
6. 删除文件
GridFS 提供了多种方式来删除文件,可以直接通过文件的 ObjectID 来删除单个文件,也可以通过查询条件来删除多个文件。这里介绍一种删除指定文件的方法:
async function deleteFile(id) { await bucket.delete(new ObjectId(id)) }
这里的 id
参数是需要删除的文件的 ObjectID。
总结
通过上面的介绍,我们可以看到使用 GridFS 来管理大文件非常简单,而且具有分布式管理、元数据查询等诸多优势。需要注意的是,在使用 GridFS 之前需要确保 MongoDB 已经正确安装和配置,并需要了解一些 Node.js 的流编程知识。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64af3ed348841e9894b4a7eb