GridFS使用介绍

1. GridFS概述

GridFS是MongoDB的一个模块化系统,用于存储和检索大文件,它将大文件切成小块(chunk)保存,并在两个集合中分别存储这些chunk,以便于检索、管理和处理。

GridFS的优点在于:

便于分布式存储和管理大文件

支持高效的文件读写操作

方便快捷地查询和下载文件

2. GridFS结构

GridFS的核心结构由两个集合组成,一个是存储chunk的chunks集合,另一个是存储文件元数据的files集合。chunks集合中的每个文档都对应一个chunk,而files集合中的每个文档则对应一个完整的文件。

2.1 chunks集合

chunks集合的每个文档都代表一个存储在GridFS中的文件块,它包含了如下的字段:

_id:该chunk的唯一标识符

files_id:该chunk所属文件的ID

n:该chunk在所有文件块中的编号

data:该chunk的二进制数据

2.2 files集合

files集合的每个文档代表一个存储在GridFS中的完整文件,它包含了如下的字段:

_id:该文件的唯一标识符

filename:该文件的名称

chunkSize:该文件块的大小,默认为255KB

uploadDate:该文件的上传日期

length:该文件的总大小

contentType:该文件的MIME类型

3. GridFS操作

下面介绍一些常见的GridFS操作:

3.1 存储文件

通过以下代码可以将一个文件存储到GridFS中:

const fs = require('fs');

const { MongoClient } = require('mongodb');

const uri = 'mongodb://localhost:27017';

const client = new MongoClient(uri);

async function run() {

try {

await client.connect();

const database = client.db('mydb');

const bucket = new mongodb.GridFSBucket(database, {

chunkSizeBytes: 1024 * 1024,

bucketName: 'photos'

});

const fileStream = fs.createReadStream('/path/to/file');

const uploadStream = bucket.openUploadStream('my-file.txt');

fileStream.pipe(uploadStream);

uploadStream.on('finish', () => {

console.log('File uploaded!');

client.close();

});

} catch (error) {

console.log(error);

}

}

run();

上述代码中,首先连接MongoDB数据库,然后创建GridFSBucket实例,并指定一个桶名称。接着使用fs模块创建一个文件读写流,并将流上传到GridFSBucket中。

3.2 查询文件

通过以下代码可以查询GridFS中的一个文件:

const { MongoClient } = require('mongodb');

const uri = 'mongodb://localhost:27017';

const client = new MongoClient(uri);

async function run() {

try {

await client.connect();

const database = client.db('mydb');

const bucket = new mongodb.GridFSBucket(database, {

chunkSizeBytes: 1024 * 1024,

bucketName: 'photos'

});

const downloadStream = bucket.openDownloadStreamByName('my-file.txt');

downloadStream.pipe(fs.createWriteStream('/path/to/download'));

downloadStream.on('end', () => {

console.log('File downloaded!');

client.close();

});

} catch (error) {

console.log(error);

}

}

run();

上述代码中,首先连接MongoDB数据库,然后创建GridFSBucket实例。接着使用openDownloadStreamByName方法查询指定名称的文件,并将其写入文件流中。

3.3 删除文件

通过以下代码可以删除GridFS中的一个文件:

const { MongoClient } = require('mongodb');

const uri = 'mongodb://localhost:27017';

const client = new MongoClient(uri);

async function run() {

try {

await client.connect();

const database = client.db('mydb');

const bucket = new mongodb.GridFSBucket(database, {

chunkSizeBytes: 1024 * 1024,

bucketName: 'photos'

});

bucket.delete('5f1286caf6b3c81c840ed51c', (error) => {

if (error) {

console.log('Delete failed!');

} else {

console.log('Delete succeeded!');

}

client.close();

});

} catch (error) {

console.log(error);

}

}

run();

上述代码中,首先连接MongoDB数据库,然后创建GridFSBucket实例。接着使用delete方法删除指定ID的文件。

4. 总结

通过本文我们了解了GridFS的基本结构和操作方法,GridFS不仅可以用来存储大文件,还支持高效的检索和管理操作,是MongoDB数据库中非常重要的一个模块。

数据库标签