📜  带有分页查询的 mongodb 存储桶 (1)

📅  最后修改于: 2023-12-03 15:09:43.677000             🧑  作者: Mango

带有分页查询的 MongoDB 存储桶

在 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 存储桶是一种用于存储大型二进制对象数据的数据类型。存储桶支持分页查询,使您能够轻松地从存储桶中获取数据。使用上述代码示例,您可以轻松上传、下载和查询存储桶中的数据,而无需担心数据量过大的问题。