MongoDB 是一个基于分布式文件存储的数据库。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

技术贴—Mongodb解析

Mongodb特点

  • MongoDB的提供了一个面向文档存储,操作起来比较简单和容易。
  • 可以在MongoDB记录中设置任何属性的索引(如:FirstName=”Sameer”,Address=”8Gandhi Road”)来实现更快的排序。
  • 可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
  • 如果负载的增加(需要更多的存储空间和更强的处理能力),它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  • MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  • Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  • Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  • Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  • MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  • MongoDB安装简单。

Mongodb应用场景

Mongodb现阶段已被许多大型网站应用,例如:淘宝,京东,github,ebay等。许多网站并非完全将传统的关系型数据库替换为mongodb,而是选择性的在部分模块应用。在应用mongodb之前,要根据自身需求以及mongodb的特点、不足进行选择。目前,mongodb适用于以下一些场景:

  • 网站数据:mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
  • 缓存:由于性能很高,mongo也适合作为信息基础设施的缓存层。在系统重启之后,由mongo搭建的持久化缓存可以避免下层的数据源过载。
  • 大尺寸、低价值的数据:使用传统的关系数据库存储一些数据时可能会比较贵,在此之前,很多程序员往往会选择传统的文件进行存储。
  • 高伸缩性的场景:mongo非常适合由数十或者数百台服务器组成的数据库。用于对象及JSON数据的存储:mongo的BSON数据格式非常适合文档格式化的存储及查询。

Mongodb优缺点

Mongodb相对关系型数据库有如下优点:

  • 高可扩展性
  • 分布式计算
  • 低成本
  • 架构的灵活性,半结构化数据
  • 没有复杂的关系

在满足以上优点的同时,却没有关系型数据库那样严格的事物支持,通常情况下,mongodb这一缺点阻碍了人们对其的选择。对于习惯利用关系型数据库的开发人员来说,mongodb没有关联查询,这也是在做数据库选型时会考虑到的。

在非关系型数据库中,mongdb拥有相对突出的优势,mongodb之所以是介于关系型数据库和非关系型数据库的产品,在于它提供了非常丰富的功能,例如MySQL中常用的数据增删改查,索引,聚合查询,分页这些功能,mongodb都提供了相应的能力,与hbase列存储相比,方便了数据的可操作性。

Mongodb适用项目

针对开发者在进行项目数据库选型时,根据mongodb的特点,优势,缺点综合考虑其适合性。例如在项目中进行的事务性操作比较多,那么mongodb就不是合适的选择。考虑到mongodb的数据存储结构比较灵活,并非固定结构,即扩展性高,那么在项目中经常出现需要扩展数据字段的情况,则可以选择mongodb。当然,项目中也可以利用不同的数据库,根据数据的性质选择存储的位置。

Mongodb概念

以下通过与MySQL对比介绍mongodb基本的术语:

技术贴—Mongodb解析

通过下图实例,我们也可以更直观的的了解Mongo中的一些概念:

技术贴—Mongodb解析

在mongodb中不存在表关联这一概念,但可以利用文档的内嵌达到数据的直接关联。

数据库

一个mongodb中可以建立多个数据库。 MongoDB的默认数据库为”db”,该数据库存储在data目录中。 MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。

集合

集合就是MongoDB文档组,类似于RDBMS(关系数据库管理系统:RelationalDatabase Management System)中的表格。集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

文档

文档是一组键值(key-value)对(即BSON)。MongoDB的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

MongoDB 数据类型

下表为MongoDB中常用的几种数据类型。

技术贴—Mongodb解析

Mongodb通用指令

Mongodb的Linux安装比较简单,在安装完mongodb后,正常启动的情况下,进入应用的/bin目录下,执行命令./mongo便进入mongodb的后台管理shell,第一次进入shell时是默认选择test库。可通过exit或quit(),或trl+C退出shell。

Mongodb中常用的shell指令

技术贴—Mongodb解析

以上简单介绍指令的用法,详细说明可参考官方文档:https://docs.mongodb.com/manual/mongo/

在mongodb中创建索引时需要注意的事项:

  • 索引占据存储空间,存储在内存中,不能超过内存的限制,如果超过会自动删除索引,影响性能。
  • 集合中索引不能超过64个
  • 索引名的长度不能超过125个字符
  • 一个复合索引最多可以有31个字段

MongoDB GridFS

GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件,以下简单介绍gridFS的用途特点:

  • GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等)。
  • GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中。
  • GridFS 可以更好的存储大于16M的文件。
  • GridFS会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中。
  • GridFS 用两个集合来存储一个文件:fs.files与fs.chunks。
  • 每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename,content_type,还有用户自定义的属性)将会被存在files集合中。

fs.files 集合文档举例:

{

“filename”: “test.txt”,

“chunkSize”: NumberInt(261120),

“uploadDate”: ISODate(“2014-04-13T11:32:33.557Z”),

“md5”: “7b762939321e146569b07f72c62cca4f”,

“length”: NumberInt(646)

}

fs.chunks 集合文档举例:

{

“files_id”: ObjectId(“534a75d19f54bfec8a2fe44b”),

“n”: NumberInt(0),

“data”: “Mongo Binary Data”

}

详细说明可参考官方文档:https://docs.mongodb.com/manual/core/gridfs/

Mongodb的存储引擎

在mongodb3.0之前,存储引擎是MMAP,属于库级锁,所有数据库的集合文档,索引数据存入一个文件。

Mongodb3.0,推出了MMAPV1,wiredtiger 。

MMAPV1,适应于所有MongoDB版本,MongoDB3.0的默认引擎,属于集合级锁。相对于MMAP,并发性能有所提升,同时其空间预分配策略以2的N次方规则进行分配,优化了空间的利用。

Wiredtiger,在mongodb3.2作为默认的存储引擎,通过多版本并发控制完成文档级别锁,并发量提高;数据压缩率高于MMAPV1,由于数据压缩率高,占用内存及CPU也增高;wiredtiger通过定期数据快照操作和预写日志完成数据的一致性,同时可作为数据恢复的依据。

在mongodb3.2版本还推出了In-Memory存储引擎,其特点是数据存储于内存中,只将少量元数据和诊断日志存储到磁盘。

Mongodb的存储引擎类型可通过参数进行配置,开发者可根据几个存储引擎的特点结合实际需求进行选择。

http://www.toutiao.com/a6408415261343039746/