MongoDB是一个开源的,高性能,无模式(或者说是模式自由),使用C++语言编写的面向文档的数据库。正由于MongoDB是面向文档的,因此它能够管理相似JSON的文档集合。又由于数据能够被嵌套到复杂的体系中并保持能够查询可索引,这样一来,应用程序即可以以一种更加天然的方式来为数据建模。javascript

下面介绍MongoDB的特色:java
- 统一的UTF-8编码:不是UTF-8编码集合的数据也能够经过使用一种特殊的二进制数据类型来保存,查询。
- 跨平台支持:二进制文件能够在Windows,Linux,OS X和Solaris平台上使用。MongoDB能够在大多数小端系统上编译经过。
- 支持丰富的类型:支持 dates, regular expressions, code, binary data 等类型。
- 查询结果支持Cursor操做。
- 支持Ad hoc queries(Ad hoc query:即席查询,数据库应用最广泛的一种查询,利用数据仓库技术,可让用户随时能够面对数据库,获取所但愿的数据。在MongoDB中,能够在任什么时候候查询任何一个field。它支持 range queries,regular expression searches 和其余特殊的查询类型。同时查询也能够包含用户定义的javascript函数。
- 支持嵌套域的查询:查询能够深刻到嵌套的对象和数组中,若是下面的对象被插入到users集合。
- 支持索引:支持二级索引包括 single-key, compound, unique, non-unique, geospatial indexes.嵌套的域一样也能够被索引。若是咱们对一个数组类型进行索引,那么数组中全部元素也会自动被索引。当一个查询执行时,MongoDB的查询优化器会尝试多个不一样的query plan,并选择执行速度最快的。开发者能够经过explain功能看到索引被使用的过程,而后能够经过hint功能来选择另外一个不一样的索引。能够在任什么时候候建立和删除索引。
- aggregation:除了ad hoc queries外,MongoDB还支持一系列工具来支持聚合,例如MapReduce和其余相似于SQL的GROUP BY的函数集合。
- 文件存储:该软件实现了一个称为GridFS的协议,这个协议是用来帮助从数据库中存储和获取文件的。
- 支持服务器端javascript执行:javaScript是MongoDB的一种通用语言,它能够被用在查询,汇集函数,直接由数据库执行。
- capped collection:MongoDB支持被称为capped collections(定量集合)的定长集合。Capped collections是惟一一种维持插入顺序的集合,其中,若是达到容量最大值,那么就会覆盖第一个元素,也就是说capped collection的行为相似于一个环形队列。一种特殊的cursor类型,称为tailable cursor,能够被用在capped collection上,当完成结果返回时,这种cursor不会关闭,而是会继续等待更多的结果来返回。也就是说若是有新的记录插入到capped collection的话,cursor会自动返回。
- 目前提供多种语言的driver。
- 部署:MongoDB使用的是memory-mapped files(内存映射文件),因此在32位机器上限制数据的最大大小为2GB,同时MongoDB服务器只能在小端系统上运行。
- Replication:MongoDB不该被部署到少于两台的服务器上,也就是说至少有一台做为master,另外一台做为slave。Master能够用来执行读写,而slave能够从master上复制数据,可是它只能执行读操做或备份操做。开发者能够根据状况让一个operation能够被replicate到多个servers上。
下面的代码是启动一个master服务器和对应的slave服务器:程序员
$ mkdir –p ~/dbs/master ~/dbs/slave
$ ./mongod –master –port 10000 –dbpath ~/dbs/master
$ ./mongod –slave --port10001 –dbpath ~/dbs/slave -- source localhost:10000
补充知识
所谓“面向集合”(Collenction-Orented),意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每一个集合在数据库中都有一个惟一的标识名,而且能够包含无限数目的文档。集合的概念相似关系型数据库(RDBMS)里的表(table),不一样的是它不须要定义任何模式(schema)。mongodb
模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,咱们不须要知道它的任何结构定义。若是须要的话,你彻底能够把不一样结构的文件存储在同一个数据库里。数据库
存储在集合中的文档,被存储为键-值对的形式。键用于惟一标识一个文档,为字符串类型,而值则能够是各中复杂的文件类型。咱们称这种存储形式为BSON(Binary Serialized dOcument Format)。express
MongoDB把数据存储在文件中(默认路径为:/data/db),为提升效率使用内存映射文件进行管理。MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集二者的优点于一身。segmentfault
根据官方网站的描述,Mongo适合用于如下场景:数组
- 网站数据:Mongo很是适合实时的插入,更新与查询,并具有网站实时数据存储所需的复制及高度伸缩性。
- 缓存:因为性能很高,Mongo也适合做为信息基础设施的缓存层。在系统重启以后,由Mongo搭建的持久化缓存层能够避免下层的数据源过载。
- 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此以前,不少时候程序员每每会选择传统的文件进行存储。
- 高伸缩性的场景:Mongo很是适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。
- 用于对象及JSON数据的存储:Mongo的BSON数据格式很是适合文档化格式的存储及查询。
天然,MongoDB的使用也会有一些限制,例如它不适合:缓存
- 高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前仍是更适用于须要大量原子性复琐事务的应用程序。
- 传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库多是更合适的选择。
- 须要SQL的问题
MongoDB主页服务器
via nowamagic.net