MongoDB学习笔记(五) MongoDB文件存取操作

由于MongoDB的文档结构为BJSON格式(BJSON全称:Binary JSON),而BJSON格式本身就支持保存二进制格式的数据,因此可以把文件的二进制格式的数据直接保存到MongoDB的文档结构中。但是由于一个 BJSON的最大长度不能超过4M,所以限制了单个文档中能存入的最大文件不能超过4M。为了提供对大容量文件存取的支持,samus驱动提供了 “GridFS”方式来支持,“GridFS”方式文件操作需要引入新的程序集“MongoDB.GridFS.dll”。下面我们分别用两种方式来实 现。

一、在文档对象中存取文件

  当文件大小较小的时候,直接存入文档对象实现起来更简洁。比如大量图片文件的存取等,一般图片文件都不会超过4M。我们先实现一个上传图片存入数据库,再取出来写回页面的例子:

   1. 把图片存到BJSON中

复制代码 代码如下:

/// <summary>
/// 把图片存到BJSON中
/// </summary>
public void SaveImgBJSON(byte[] byteImg)
{
    Document doc = new Document();
    doc["ID"] = 1;
    doc["Img"] = byteImg;
    mongoCollection.Save(doc);
}

2. 获取BJSON方式存储的图片字节数据

复制代码 代码如下:

/// <summary>
/// 获取BJSON方式存储的图片字节数据
/// </summary>
public byte[] GetImgBJSON()
{
  Document doc=  mongoCollection.FindOne(new Document { { "ID", 1 } });
  return doc["Img"] as Binary;
}

上面两段代码是在对MongoDB相关操作进行BLL封装类中添加的两个方法,封装方式查看上节内容。下面看看在webform中如何调用:

  在界面拖出一个FileUpload控件和一个Button控件,页面cs类加如下方法:

复制代码 代码如下:

protected void Button1_Click(object sender, EventArgs e)
{
    ImgBLL imgBll = new ImgBLL();
    imgBll.DeleteAll();
    imgBll.SaveImgBJSON(FileUpload1.FileBytes);
    Response.BinaryWrite(imgBll.GetImgBJSON());
}

二、用GridFS方式存取文件

  在实现GridFS方式前我先讲讲它的原理,为什么可以存大文件。驱动首先会在当前数据库创建两个集合:"fs.files" 和"fs.chunks"集合,前者记录了文件名,文件创建时间,文件类型等基本信息;后者分块存储了文件的二进制数据(并支持加密这些二进制数据)。分 块的意思是把文件按照指定大小分割,然后存入多个文档中。"fs.files"怎么知道它对应的文件二进制数据在哪些块呢?那是因为 在"fs.chunks"中有个"files_id"键,它对应"fs.files"的"_id"。"fs.chunks"还有一个键(int 型)"n",它表明这些块的先后顺序。这两个集合名中的"fs"也是可以通过参数自定义的。

  如果你只是想知道怎么用,可以忽略上面这段话,下面将用法:

   1. GridFS方式的文件新建,读取,删除

复制代码 代码如下:

private string GridFsSave(byte[] byteFile)
{
    string filename = Guid.NewGuid().ToString();

    //这里GridFile构造函数有个重载,bucket参数就是用来替换那个创建集合名中默认的"fs"的。
    GridFile gridFile = new GridFile(mongoDatabase);
    using (GridFileStream gridFileStream = gridFile.Create(filename))
    {
        gridFileStream.Write(byteFile, 0, byteFile.Length);
    }
    return filename;
}

private byte[] GridFsRead(string filename)
{
    GridFile gridFile = new GridFile(mongoDatabase);
    GridFileStream gridFileStream = gridFile.OpenRead(filename);
    byte[] bytes = new byte[gridFileStream.Length];
    gridFileStream.Read(bytes, 0, bytes.Length);
    return bytes;
}

private void GridFsDelete(string filename)
{
    GridFile gridFile = new GridFile(mongoDatabase);
    gridFile.Delete(new Document("filename", filename));
}

2. 再次封装GridFS操作,新文档只存储文件名称,相当于只是一个键,新文档还可以有除“文件名”之外其他的键。

复制代码 代码如下:

/// <summary>
/// 把图片存到GridFS中
/// </summary>
public void SaveImgGridFS(byte[] byteImg)
{
    string filename = GridFsSave(byteImg);

    Document doc = new Document();
    doc["ID"] = 1;
    doc["filename"] = filename;
    mongoCollection.Save(doc);
}

/// <summary>
/// 获取GridFS方式存储的图片
/// </summary>
public byte[] GetImgGridFS()
{
    Document doc = mongoCollection.FindOne(new Document { { "ID", 1 } });
    string filename = doc["filename"].ToString();
    return GridFsRead(filename);
}

三、小结

  文件存取应该不是很难,值得注意的地方是:用第一种方式从文档中读出二进制数据时,一定要将类型转换为“Binary”类型;还有系统自带的键“_id”,它也不是string类型,是“Oid”类型的。

作者:李盼(Lipan)
出处:[Lipan] (http://www.cnblogs.com/lipan/)

时间: 2024-09-19 09:27:08

MongoDB学习笔记(五) MongoDB文件存取操作的相关文章

MongoDB学习笔记(五) MongoDB文件存取操作_服务器其它

由于MongoDB的文档结构为BJSON格式(BJSON全称:Binary JSON),而BJSON格式本身就支持保存二进制格式的数据,因此可以把文件的二进制格式的数据直接保存到MongoDB的文档结构中.但是由于一个BJSON的最大长度不能超过4M,所以限制了单个文档中能存入的最大文件不能超过4M.为了提供对大容量文件存取的支持,samus驱动提供了"GridFS"方式来支持,"GridFS"方式文件操作需要引入新的程序集"MongoDB.GridFS.

MongoDB学习笔记(一) MongoDB介绍与安装方法

最近开始学习非关系型数据库MongoDB,却在博客园上找不到比较系统的教程,很多资料都要去查阅英文网站,效率比较低下.本人不才,借着自学的机会把心得体会都记录下来,方便感兴趣的童鞋分享讨论   一.前言 最近开始学习非关系型数据库MongoDB,却在博客园上找不到比较系统的教程,很多资料都要去查阅英文网站,效率比较低下.本人不才,借着自 学的机会把心得体会都记录下来,方便感兴趣的童鞋分享讨论.部分资源出自其他博客,旨将零散知识点集中到一起,如果有侵犯您的权利,请联系li- pan2@163.co

MongoDB学习笔记(一) MongoDB介绍与安装方法_服务器其它

一.前言 最近开始学习非关系型数据库MongoDB,却在博客园上找不到比较系统的教程,很多资料都要去查阅英文网站,效率比较低下.本人不才,借着自学的机会把心得体会都记录下来,方便感兴趣的童鞋分享讨论.部分资源出自其他博客,旨将零散知识点集中到一起,如果有侵犯您的权利,请联系li-pan2@163.com.大部分内容均系原创,欢迎大家转载分享,但转载的同时别忘了注明作者和原文链接哦. 二.MongoDB简介 MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的

MongoDB 学习笔记(一)-MongoDB配置_MongoDB

MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 步入正题: 下载MongoDB 下载地址:https://www.mongodb.com/download-center?jmp=nav 这里是在windows平台下安装MongoDB, 下载后,在本机,按提示进行安装. 注: 这个安装只

MongoDB学习笔记(六) MongoDB索引用法和效率分析

MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据 类型,也可以是子文档.MongoDB可以在各种类型的键上创建索引.下面分别讲解各种类型的索引的创建,查询,以及索引的维护等. 一.创建索引 1. 默认索引 MongoDB有个默认的"_id"的键,他相当于"主键"的角色.集合创建后系统会自动创建一个索引在"_id"键上,它是默认索引,索引名叫"_id

MongoDB学习笔记(六) MongoDB索引用法和效率分析_服务器其它

MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索引.下面分别讲解各种类型的索引的创建,查询,以及索引的维护等. 一.创建索引 1. 默认索引 MongoDB有个默认的"_id"的键,他相当于"主键"的角色.集合创建后系统会自动创建一个索引在"_id"键上,它是默认索引,索引名叫"_id_

Windows phone 8 学习笔记(2) 数据文件操作

原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方.本节主要讲解它们的用法以及相关限制性.另外包括本地数据库的使用方式. 快速导航:     一.分析各类数据文件存储方式     二.安装文件夹     三.本地文件夹(独立存储空间)     四.媒体库操作     五.本地数据库 一.分析各类数据文件存储方式 1)安装文件夹 安装文件夹即应用安装

kvm虚拟化学习笔记(五)之windows虚拟机性能调整

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1290682 KVM虚拟化学习笔记系列文章列表 ---------------------------------------- kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51cto.com/703525/1288795 kvm虚拟化学习笔记(二)之linuxkvm虚拟机安装htt

C#可扩展编程之MEF学习笔记(五):MEF高级进阶

好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用的基本已经讲完了,相信大家已经能看出MEF所带来的便利了.今天就介绍一些MEF中一些较为不常用的东西,也就是大家口中的所谓的比较高级的用法. 前面讲的导出都是在每个类上面添加Export注解,实现导出的,那么有没有一种比较简便的方法呢?答案是有的,就是在接口上面写注解,这样只要实现了这个接口的类都会