MongoDb GridFS的使用

MongoDb GridFS 是MongoDB的文件存储方案,主要用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频等),对大文件有着更好的性能。

要在C#中使用GridFS,首先安装Nuget包: MongoDB.Driver.GridFS

Bucket

GridFS中的数据也是分集合存储的,每个集合叫一个bucket,每个bucket里面可以存储多个文件:

在C#中使用bucket和使用集合差不多,创建一个GridFSBucket对象即可。

var bucket = new GridFSBucket(db, new GridFSBucketOptions()
{
    BucketName     = "my_bucket",
    ChunkSizeBytes = 256 * 1024, //块大小
});

对于bucket,主要的参数就是bucket名称和块大小,它也不用手动创建,在使用的时候会自动创建。

上传数据

对于byte[]数组,可以直接使用UploadFromBytes上传:

var data = Enumerable.Range(0, 256).Select(i => (byte)i).ToArray();var id = bucket.UploadFromBytes("filename", data);

主要参数是传入一个文件名(文件名并不要求唯一,同一bucket类可以重复),返回数据id。

也可以带入metadata信息。

var options = new GridFSUploadOptions{    Metadata = new BsonDocument    {        {"resolution", "1080P"},        {"copyrighted", true}    },    DisableMD5 = true,};var id   = bucket.UploadFromBytes("filename", data, options);

上传Stream

使用UploadFromBytes上传的时候,需要将上传的数据全部读取到内存,如果需要上传的是较大的文件,这种方式并不合适。此时可以使用UploadFromStream函数上传。

using (var fs = File.OpenRead(@"r:\123.jpg")){    bucket.UploadFromStream("123.jpg", fs);}

也可以使用OpenUploadStream的方式打开为一个Stream,然后通过推的方式完成上传。

using (var fs = File.OpenRead(@"r:\123.jpg"))using (var upload = bucket.OpenUploadStream("123.jpg")){    fs.Copy(upload);    upload.Close();    Console.WriteLine(upload.Id);}

注意:这个stream必须手动Close,只是调用Dispose不会写入到bucket中去。不知道算不算MongoDB API的一个bug。

下载:

下载的API和上传类似,如下是几个基本示例:

var id = new ObjectId("5b6ba04c77850928a438b1b2");var bytes = bucket.DownloadAsBytes(id);

using (var target = File.Create(@"r:\target.jpg")){    bucket.DownloadToStream(id, target);}

using (var download = bucket.OpenDownloadStream(id))using (var target = File.Create(@"r:\target.jpg")){    download.CopyTo(target);}

查询:

GridFS 用两个集合来存储一个文件:fs.files与fs.chunks。对于bucket中的记录,实际上存成了两个部分。

  • 文件的实际内容被存在chunks(二进制数据)中,拆分成了一堆chunk存储
  • 相关的描述信息files集合中,它是一个标准的mongodb的文档模型,其结构为:
{
  "_id" : <ObjectId>,
  "length" : <num>,
  "chunkSize" : <num>,
  "uploadDate" : <timestamp>,
  "md5" : <hash>,
  "filename" : <string>,
  "contentType" : <string>,
  "aliases" : <string array>,
  "metadata" : <any>,
}
gridfs对filename 和uploadDate字段做了索引的,通过它们查询能获取到较好的性能。

参考文档: https://docs.mongodb.com/manual/core/gridfs/

gridfs的api中封装了对它的查询,也是遵循标准的查询API的

var filter = new {filename = "123.jpg"};var result = bucket.Find(filter.ToBsonDocument()).ToList();

另外,也可以直接操作fs.files集合。

var files = db.GetCollection<BsonDocument>("my_bucket.files");

更新:

GridFS的API支持对文档重命名:

bucket.Rename(id, "NewName");

但没有找打更新MetaData的API,在网上找了一下,有人已经提了这个问题。结论是目前官方没有封装,不过可以从fs.files集合中直接更新metadata。示例如下。

var files = db.GetCollection<BsonDocument>("my_bucket.files");

var filter = new BsonDocument(){    ["_id"] = id};var update = new BsonDocument(){    ["$set"] = new BsonDocument()    {        ["metadata"] = metaData    }};

files.UpdateOne(filter, update);

小结

Gridfs的API封装还算好用的,就是不过不知道为什么没有封装对描述信息的更新操作。官方文档链接如下,要深入学习的可以查看一下。

本文这里主要介绍的是GridFS的使用,但需要注意的是,GridFS本身并不是分布式存储服务,它仍然依赖于MongoDB,并不是解决大规模的分布式存储的问题的,需要大容量存储和负载均衡等场景建议还是交给FastDFS等专业的服务来。

不过,对于一些性能和容量要求不高的企业应用,存储一些图片,附件等小规模存储场景,还是非常合适的。部署和使用都是非常方便快捷的。

另外,网上也有一些深入点介绍GridFS的文档,也可以看下。

原文地址:https://www.cnblogs.com/TianFang/p/9452437.html

时间: 2024-11-01 12:28:48

MongoDb GridFS的使用的相关文章

【转】PHP操作MongoDB GridFS 存储文件

PHP操作MongoDB GridFS 存储文件,如图片文件 GridFS是MongoDB的一个内置功能,它提供一组文件操作的API以利用MongoDB存储文件,GridFS的基本原理是将文件保存在两个Collection中,一个保存文件索引,一个保存文件内容,文件内容按一定大小分成若干块,每一块存在一个Document中,这种方法不仅提供了文件存储,还提供了对文件相关的一些附加属性(比如MD5值,文件名等等)的存储.

MongoDB GridFS最佳应用概述

<MongoDB GridFS最佳应用概述> 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs GridFS是MongoDB数据库之上的一个简单文件系统抽象.如果你熟悉Amazon S3的话,那么GridFS与之相似.为什么像MongoDB这样的NoSQL数据库会提供这样的一个文件层抽象呢? 一.使用GridFS的理由 理由如下: 1)存储用户产生的文件内容 大多数Web应用都允许用户上传文件.当用户使用关系数据库时,这些用户产生的文件会存储在文件系

MongoDB GridFS规范

This is being changed for 2.4.10 and 2.6.0-rc3. Tyler Brock's explanation: Now that the server uses power of 2 by default, if the default chunk size for gridfs is 256k we will almost always be throwing away some storage space. This is because if the

mongodb gridfs基本使用

Mongodb GridFS图片文件存储解决方案 之前解决方案是接收图片数据后,将图片直接存储到盘阵,然后通过Apache做服务器,将图片信息存储到数据库,并且存储一个Apache的访问路径. 目前需要后台服务存储图片,将图片存储到MongoDB集群中,然后通过Nginx中的nginx-gridfs模块进行访问,在浏览器中通过url访问,效果与Apache访问本地文件一样. 本方案的内容比较基础,以后会有深入了解和优化,敬请期待! 一.安装MongoDB (1)安装MongoDB 进入计划安装目

MongoDB(八)Mongodb——GridFS存储

mongoDB的文档以BSON格式存储,支持二进制的数据类型,当我们把二进制格式的数据直接保存到mongoDB的文档中.但是当文件太大时,例如图片和视频等文件,每个文档的长度是有限的,于是mongoDb会提供了一种处理大文件的规范--GridFS. GridFS实现原理 在GridFS数据库中,默认使用fs.chunks 和fs.files来存储文件,其中fs.files集合存放文件的信息,fs.chunks存放文件的数据,一个fs.files集合中的一条记录内容如下,即一个file信息如下所示

MongoDB GridFS

1. GridFS说明: GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片.音频.视频等). GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中. GridFS 可以更好的存储大于16M的文件. GridFS 会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中. GridFS 用两个集合来存储一个文件:fs.files与fs.chun

MongoDB GridFS 初探

使用GridFS简单介绍: 列出文件: [[email protected] ~]# mongofiles listconnected to: 127.0.0.1 此时并没有任何文件存在. 上传文件: [[email protected] ~]# mongofiles put install.log -d librarayconnected to: 127.0.0.1added file: { _id: ObjectId('5616b8c4f1403ca60b0999d0'), filename

MongoDB——GridFS

GridFS是一个规范的存储和检索文件超过16 mb的bson文档大小限制. 而不是将文件存储在一个文档中,GridFS文件分为部分,或块,每个块作为一个单独的文档.使用FridFS与使用分片无 关.在默认情况下网格文件系统块大小限制为255 k.GridFS文件系统使用两个集合存储文件.一个收集存储文件块, 其他商店文件元数据. 当你查询GridFS文件系统存储文件时,驱动或客户端将重新组装块.你可以通过GridFS文件系统上执行范围查询 文件存储.你也可以从任意部分的文件访问信息,你可以"跳

PHP操作MongoDB GridFS 存储文件,如图片文件

GridFS是MongoDB的一个内置功能,它提供一组文件操作的API以利用MongoDB存储文件,GridFS的基本原理是将文件保存在两个Collection中,一个保存文件索引,一个保存文件内容,文件内容按一定大小分成若干块,每一块存在一个Document中,这种方法不仅提供了文件存储,还提供了对文件相关的一些附加属性(比如MD5值,文件名等等)的存储. 01 <?php 02 // 初始化gridfs 03 $conn = new Mongo(); // 连接MongoDB 04 $db