MongoDB GridFS


MongoDB GridFS技术文档

简介

MongoDB GridFS是一个用于存储和访问大型文件(例如音频、视频和图像等)的协议。它是MongoDB的一部分,支持将文件以二进制格式保存在MongoDB中,并提供透明的读/写文件接口。

流程

当你通过GridFS将文件存储到MongoDB中时,它将对文件进行分块存储。每个数据块的默认大小为255KB,但可以通过配置参数进行更改。在将文件分块后,GridFS将对这些块建立索引,以便于查找和检索。

优势

与传统的关系型数据库不同,MongoDB GridFS可以直接存储二进制文件。这些文件可以是非常大的,而且容易扩展。由于MongoDB是非常可扩展的,因此你可以轻松地从单节点扩展到分布式数据库,以应对大型文件的存储和传输。

使用方法

存储

使用GridFS存储一个文件时,你需要新建一个WriteStream流来写入数据,然后通过gridfs.writeFile方法来写入这个流。若成功写入数据,你将会得到一个包含文件_id属性的文件对象。

var mongodb = require('mongodb');
var MongoClient = mongodb.MongoClient;
var GridFSBucket = mongodb.GridFSBucket;

MongoClient.connect('mongodb://localhost/test', function(err, db) {
  
  var bucket = new GridFSBucket(db);

  var readStream = getReadStreamSomehow();
  var uploadStream = bucket.openUploadStream('test.dat');
  
  readStream.pipe(uploadStream);
  
  uploadStream.on('finish', function() {
    console.log('done!');
    db.close();
  });
});

读取

使用GridFS读取一个文件时,你需要新建一个ReadStream流,然后通过gridfs.openDownloadStream方法来打开这个流。一旦你成功打开读取流,你就可以像使用任何其他可读流一样来使用它。

var mongodb = require('mongodb');
var MongoClient = mongodb.MongoClient;
var GridFSBucket = mongodb.GridFSBucket;

MongoClient.connect('mongodb://localhost/test', function(err, db) {

  var bucket = new GridFSBucket(db);

  var readStream = bucket.openDownloadStreamByName('test.dat'); 
  readStream.pipe(process.stdout);

  readStream.on('end', function() {
    console.log('done!');
    db.close();
  });
});

元数据

一旦你成功地将文件存储到MongoDB中,你可以使用GridFSBucket的find方法来查找和检索它们。在对文件进行检索时,你可以访问它们的元数据信息,并为它们添加新的元数据信息。

var mongodb = require('mongodb');
var MongoClient = mongodb.MongoClient;
var GridFSBucket = mongodb.GridFSBucket;

MongoClient.connect('mongodb://localhost/test', function(err, db) {
  var bucket = new GridFSBucket(db);

  bucket.find({ filename: 'test.dat' }).toArray(function(err, files) {
    var fileInfo = files[0];
    console.log(fileInfo);
  });
});

注意事项

一些值得注意的事项包括:

  • MongoDB GridFS不适合用于存储一些常规的数据。要存储可以被序列化的数据对象应该选用其他的存储方法。
  • MongoDB GridFS的默认数据块大小为255KB。如果你需要存储大型文件,则应该通过配置参数来修改这个默认值。
  • MongoDB GridFS可以在MongoDB的分片集群上工作。但是,如果你在生产环境中使用MongoDB GridFS存储大型文件,则应该评估使用其他分布式文件存储系统的可能性。

总结

MongoDB GridFS是一个非常有用的工具,可以轻松地存储和检索大型文件。使用GridFS,你可以存储、访问和操作图像、音频和视频等任何文件数据。如果你正在寻找一个可扩展的、简单的、易于维护的文件系统,则MongoDB GridFS是一个不错的选择。