📅  最后修改于: 2023-12-03 15:09:43.677000             🧑  作者: Mango
在 MongoDB 中,存储桶(Bucket)是用于存储大型二进制对象(Large Binary Object,LBO)的数据类型。通常,存储桶用于存储图像、音频、视频等多媒体文件,这些文件可能非常大并且不适合直接存储在 MongoDB 集合中。存储桶将这些数据切分成多个块,然后存储在一个名为“fs.files”的文档中。在“fs.files”文档中,每个存储桶块都对应一个文件块文档,而每个文件块文档都包含一个数据块字段,用于存储实际的二进制数据。存储桶也支持分页查询,因此您可以轻松获取存储桶中的大型二进制对象数据。
首先,您需要创建一个存储桶。要创建一个存储桶,您可以使用以下 MongoDB Shell 命令:
db.createCollection('fs.files');
db.createCollection('fs.chunks');
此命令将创建两个集合,“fs.files”集合用于存储存储桶的元数据,而“fs.chunks”集合用于存储实际的二进制数据块。
要将文件上传到存储桶中,请使用以下代码:
const { MongoClient } = require('mongodb');
const assert = require('assert');
const url = 'mongodb://localhost:27017';
const dbName = 'myproject';
const client = new MongoClient(url);
client.connect((err) => {
assert.strictEqual(null, err);
console.log('Connected successfully to server');
const db = client.db(dbName);
const bucket = new mongodb.GridFSBucket(db);
const filename = 'example.txt';
const uploadStream = bucket.openUploadStream(filename);
fs.createReadStream(filename).pipe(uploadStream);
uploadStream.on('finish', () => {
console.log('File successfully uploaded');
client.close();
});
});
此代码中,我们使用 GridFSBucket 对象来打开一个写入流,然后将数据流式传输到存储桶中。
要从存储桶中下载文件,请使用以下代码:
const { MongoClient } = require('mongodb');
const assert = require('assert');
const url = 'mongodb://localhost:27017';
const dbName = 'myproject';
const client = new MongoClient(url);
client.connect((err) => {
assert.strictEqual(null, err);
console.log('Connected successfully to server');
const db = client.db(dbName);
const bucket = new mongodb.GridFSBucket(db);
const filename = 'example.txt';
const downloadStream = bucket.openDownloadStreamByName(filename);
downloadStream.pipe(fs.createWriteStream(`./downloads/${filename}`));
downloadStream.on('end', () => {
console.log('File successfully downloaded');
client.close();
});
});
此代码中,我们使用 openDownloadStreamByName 方法打开一个读取流,然后将数据流式传输到文件系统中。
要进行带有分页查询的存储桶查询,请使用以下代码:
const { MongoClient } = require('mongodb');
const assert = require('assert');
const url = 'mongodb://localhost:27017';
const dbName = 'myproject';
const client = new MongoClient(url);
client.connect((err) => {
assert.strictEqual(null, err);
console.log('Connected successfully to server');
const db = client.db(dbName);
const bucket = new mongodb.GridFSBucket(db);
const pageSize = 10;
const query = { filename: { $regex: 'example.*' } };
bucket.find(query)
.sort({ uploadDate: -1 })
.skip(0)
.limit(pageSize)
.toArray((err, files) => {
assert.strictEqual(null, err);
console.log('Files: ', files);
client.close();
});
});
此代码中,我们使用 find 方法来查找以“example”开头的文件,然后对结果进行排序、限制和分页。最后,我们将查询结果作为数组返回。
MongoDB 存储桶是一种用于存储大型二进制对象数据的数据类型。存储桶支持分页查询,使您能够轻松地从存储桶中获取数据。使用上述代码示例,您可以轻松上传、下载和查询存储桶中的数据,而无需担心数据量过大的问题。