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。另外,GridFS的这个GridFSUploadStream.Close是通过隐藏的方式实现的,如果将他转换成了Stream使用,此时调用Close不能上传至GridFS,需要将其转换成GridFSUploadStream才行。
下载:
下载的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的文档,也可以看下。
MongoDb GridFS的使用的更多相关文章
- CentOS6.3搭建Nginx代理访问MongoDB GridFS图片资源
PHP可以直接读取MongoDB GridFS中的图片并显示到页面中,但对PHP的压力就大了.偶然机会,了解到Nginx可以代理访问,实现过程如下: 1.工具准备 安装一些必要的编译工具及库,这里是直 ...
- MongoDB的学习和使用(MongoDB GridFS)
MongoDB GridFS GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片.音频.视频等). GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中 ...
- MongoDB GridFS 存储大文件
我们经常会遇到这样的场景:上传/下载文件. 有两种思路可以解决这个问题: (1)将文件存储在服务器的文件系统中: (2)将文件存储在数据库中. 如果我们选择(2),那么我们可以使用MongoDB Gr ...
- MongoDB GridFS 存储文件
使用MongoDB的GridFS方式. CSDN: https://blog.csdn.net/qq_32657967/article/details/81534259官方文档: https://do ...
- mongodb gridfs基本使用
Mongodb GridFS图片文件存储解决方案 之前解决方案是接收图片数据后,将图片直接存储到盘阵,然后通过Apache做服务器,将图片信息存储到数据库,并且存储一个Apache的访问路径. 目前需 ...
- MongoDB GridFS最佳应用概述
<MongoDB GridFS最佳应用概述> 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs GridFS是MongoDB数据库之上的一个简单 ...
- MongoDB GridFS——本质上是将一个文件分割为大小为256KB的chunks 每个chunk里会放md5标识 取文件的时候会将这些chunks合并为一个整体返回
MongoDB GridFS GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片.音频.视频等). GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中 ...
- Spring Boot使用MongoDB GridFS进行文件的操作
1. GridFS简介 GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片.音频.视频等),但是它是存储在MonoDB的集合中. GridFS 会将文件对象分割成多个的ch ...
- 【荐】PHP操作MongoDB GridFS 存储文件,如图片文件
GridFS是MongoDB的一个内置功能,它提供一组文件操作的API以利用MongoDB存储文件,GridFS的基本原理是将文件保存在两个Collection中,一个保存文件索引,一个保存文件内容, ...
随机推荐
- 【洛谷P3884 [JLOI2009]】二叉树问题
题目描述 如下图所示的一棵二叉树的深度.宽度及结点间距离分别为: 深度:4 宽度:4(同一层最多结点个数) 结点间距离: ⑧→⑥为8 (3×2+2=8) ⑥→⑦为3 (1×2+1=3) 注:结点间距离 ...
- jquery或者js对html控件的处理汇总
1.下拉列表select的处理 a).后台通过jquery获取的json数据对下拉列表select的赋值操作: html页面:<select name="gameserverlist& ...
- c语言.函数指针数组
函数指针: 一个指向函数的指针.一般用函数名表示. 函数指针数组:元素为函数指针的数组.转移表.c语言中函数不可以定义为数组,只能通过定义函数指针来操作. #include<stdio.h> ...
- python模块分析之hashlib加密(二)
前言 hashlib模块是py3.+用来对字符串进行hash加密的模块,核心算法是md5,明文与密文是一一对应不变的关系:用于注册.登录时用户名.密码等加密使用. 模块分析 hashlib模块有多种加 ...
- 使用@SpringBootApplication注解
很多Spring Boot开发者总是使用@Configuration , @EnableAutoConfiguration 和 @ComponentScan 注解他们的main类. 由于这些注解被如此 ...
- 使用eclipse构建Maven项目及发布一个Maven项目
开发环境: Eclipse Jee Mars(截止2015年12月1日目前的最新版eclipse4.5),下载地址:http://www.eclipse.org/downloads/ 因为此版本已经集 ...
- 在Docker中运行EOS(MAC版)
在Docker中运行EOS(MAC版) 在Docker中也可以简单快速的构建EOS.IO.笔者在Mac平台下参考官方文档躺了一次河.记录如下: 安装依赖 Docker 版本 17.05或者更高 tes ...
- [原创]win7环境下搭建eclipse+python+django开发环境
一)工具下载 a)eclipse(最新版4.3.1)官网下载地址 http://www.eclipse.org/downloads/ b)python (2.X版本)官网下载地址 http://pyt ...
- 【linux】shell中命令替换$(cmd)和符号`cmd`
来源:https://zhidao.baidu.com/question/485498670.html 作用: $(cmd)和`cmd`的作用是相同的,在执行一条命令时,会先将其中的 ``,或者是$( ...
- Java 组合
组合: 在新类中产生现有类的对象,由于新的类是由现有类的对象所组成,所以这种方法称为组合 组合和继承都允许在新的类中放置对象,组合时显示的这样做,而继承则是隐式的这样做 组合技术通常用于想在新类中使用 ...