在前端开发中,我们经常需要存储和处理大量的文件,例如图片、视频、音频等等。而传统的关系型数据库并不是特别适合用于存储这些类型的文件,因为它们占据了大量的存储空间,并且很难查询和管理。MongoDB 提供了一个名为 GridFS 的文件存储系统,可以帮助我们更有效地存储和管理这些文件。
什么是 MongoDB GridFS
GridFS 是 MongoDB 的一种存储机制,可以用于存储和检索大量的二进制数据,例如图片、视频、音频等等。与传统的文件存储方式不同,GridFS 将文件分成了两个推荐的部分——元数据和二进制数据。
元数据存储在用户定义的文档对象中,包括文件名、大小、类型等信息。二进制数据存储在一个或多个文件中,每个文件都会根据特定块大小进行切分,每个块大小默认为 255KB。
在 MongoDB 中,GridFS 将文件存储为两个集合——fs.chunks 和 fs.files。fs.chunks 集合存储文件的实际二进制数据,而 fs.files 集合则存储文件的元数据。
下面是一个 GridFS 文件对象的示例:
// javascriptcn.com 代码示例 { "_id" : ObjectId("5f1a79ea618086b1908c54b8"), "filename" : "myimage.png", "chunkSize" : NumberLong(261120), "uploadDate" : ISODate("2020-07-23T13:02:50.535Z"), "length" : NumberLong(128932), "contentType" : "image/png", "metadata" : { "description" : "A beautiful image of a mountain." } }
如何使用 MongoDB GridFS
GridFS 提供了多种语言的驱动程序,包括 Node.js。在 Node.js 中使用 GridFS,我们需要先安装 "mongodb" 包。安装方式可以使用 npm 进行安装,如下所示:
npm install mongodb
下面是一个使用 GridFS 存储文件的示例代码:
// javascriptcn.com 代码示例 const MongoClient = require('mongodb').MongoClient; const GridFSBucket = require('mongodb').GridFSBucket; const fs = require('fs'); // 连接 MongoDB 实例 const uri = 'mongodb://localhost:27017/mydatabase'; const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true }); client.connect((err) => { if (err) { console.log('Failed to connect to MongoDB:', err); return; } // 打开 GridFS 存储桶 const db = client.db('mydatabase'); const bucket = new GridFSBucket(db); // 从本地读取二进制数据 const data = fs.readFileSync('/path/to/myfile.jpg'); // 将数据写入到 GridFS 中 const uploadStream = bucket.openUploadStream('myfile.jpg'); uploadStream.write(data); uploadStream.end(); // 关闭 MongoDB 连接 client.close(); });
上面的代码中,我们首先连接到 MongoDB 实例,然后使用 GridFSBucket 对象打开一个存储桶。接着,我们使用 fs 模块读取本地文件的二进制数据,并将其写入到 GridFS 中。最后,我们关闭 MongoDB 连接。
细节处理
保存元数据
在存储文件时,我们可以在一个 Mongo 文档中保存文件的元数据。在 Node.js 代码中,我们可以使用以下方式添加元数据:
const uploadStream = bucket.openUploadStream('myfile.jpg', { metadata: { somekey: 'somevalue' } });
在这里,我们将元数据作为一个对象传递给 openUploadStream() 函数。
删除文件
在 MongoDB 中删除文件,我们需要删除两个集合中的记录——fs.chunks 和 fs.files。例如,删除名为 "myfile.jpg" 的文件可以使用以下代码:
const id = new ObjectId('5f1a79ea618086b1908c54b8'); gridFSBucket.delete(id, (error) => { if (error) { console.log('Failed to delete the file:', error); } else { console.log('File has been deleted.'); } });
在这里,我们首先创建了一个 ObjectId,它代表要删除的文件。然后,我们使用 GridFSBucket 的 delete() 方法来删除文件。
查询文件
在 MongoDB 中查询文件,我们可以使用以下代码:
const fileInfo = await gridFSBucket.find({ filename: 'myfile.jpg' }).toArray(); console.log(fileInfo);
在这里,我们使用 GridFSBucket 的 find() 方法查询文件信息。find() 方法返回一个流式游标,使用 toArray() 方法将结果转换为数组。我们可以在查询条件中传递元数据来进行更精细的查询。
总结
在本文中,我们介绍了 MongoDB GridFS 的用法。我们了解了 GridFS 的基本概念,并学习了如何在 Node.js 中使用 GridFS。我们还介绍了一些细节处理方面的知识,例如如何保存元数据、删除文件和查询文件信息。我们相信,在实际项目开发中,使用 MongoDB GridFS 将会是一个不错的选择,它可以帮助我们更好地存储和管理大量的二进制文件。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6540d4987d4982a6eba65e69