MongoDB 是目前非常流行的文档数据库,而在实际开发中,我们很可能需要存储一些二进制数据,例如图片、音频、视频等,那么在 MongoDB 中如何实现呢?
BSON 的数据类型
在 MongoDB 中,所有的数据都是以 BSON 格式存储的,BSON 即 Binary JSON,是一种类 JSON 的二进制数据交换格式。
BSON 支持的数据类型包括:
- double:IEEE 754 格式的浮点数。
- string:UTF-8 编码的字符串。
- object:一组键值对。
- array:一组值的有序列表。
- binary data:二进制数据。
- ObjectId:一个 12 字节的 MongoDB 对象 ID。
- boolean:true 或 false。
- date:表示自 1970 年 1 月 1 日 以来的毫秒数。
- null:null 值。
- regular expression:正则表达式。
- JavaScript code:JavaScript 代码。
- symbol:符号。
- JavaScript code with scope:JavaScript 代码,可以包含作用域。
- 32-bit integer:32 位整数。
- timestamp:时间戳。
- 64-bit integer:64 位整数。
- decimal128:128 位十进制浮点数。
- min key:指定最小键值。
- max key:指定最大键值。
可以看到,在 BSON 支持的数据类型中,有一个 binary data 类型,它用于存储二进制数据。
存储二进制数据
存储二进制数据的方式有两种:
1. 直接存储二进制数据
直接存储二进制数据的方式比较简单,只需要将数据以二进制格式存储在一个字段中即可。
例如,我们可以定义一个文档类型为 image,用于存储图片数据:
{ "_id": ObjectId("5f2f099b0d2613367465e9b5"), "name": "My Image", "data": BinData(0, "iVBORw0KGgoAAAANSUhEUgAAAAUA") }
其中,data 字段用于存储二进制数据,BinData 函数的第一个参数指定数据类型,0 表示一般的二进制数据。第二个参数即为二进制数据本身。
2. 存储二进制数据的 URL
另一种方式是将二进制数据存储在外部文件中,然后在 MongoDB 中存储文件的 URL 地址。
为了支持这种方式,MongoDB 内置了一个(GridFS)存储系统,它可以轻松地存储和检索超大型的二进制数据。
GridFS 中文件的存储方式类似于在文件系统中储存文件,每个文件会被分为多个块,存储在两个集合中:
- fs.files:存储文件的元数据。
- fs.chunks:存储文件块的二进制数据。
下面是一个使用 GridFS 存储二进制数据的示例:
-- -------------------- ---- ------- ----- ---- - ------------------------- ----- -------- - -------------------- ----- ---- - ------------------------------------------------------------- --- ---- ----------------- -- -- - --- - ------------- ---------------- --- ----- --------- - - --------- --------------- ------------ ----------- -- -- ------ ------ - ----- ------ - -------------------------------------- ----- ----------- - --------------------------------- ------------------------- ----------------------- ------ -- - ------------------------- - --------- ---
这里我们通过 createWriteStream 方法将数据流存入 GridFS 中,createWriteStream 方法的参数即为文件的元数据,包括文件名和文件类型等。
在存储完成后,我们可以从 fs.files 中查找到对应的文件信息。同样的,通过 createReadStream 方法可以从 GridFS 中读取二进制数据。
总结
通过本文的介绍,我们了解了 BSON 的数据类型,以及在 MongoDB 中存储二进制数据的两种方式:直接存储二进制数据和存储二进制数据的 URL。
在实际开发中,选择何种方式主要取决于业务场景和开发需求。同时,我们也可以结合 GridFS 存储系统来更方便地存储和检索超大型的二进制数据。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646c1aee968c7c53b0b28af5