1、简介
MongoDB是基于文档的存储的(而非表),是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。模式自由(schema-free),意味着对于存储在MongoDB数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
Mongo主要解决的是海量数据的访问效率问题。因为Mongo主要是支持海量数据存储的,所以Mongo还自带了一个出色的分布式文件系统GridFS,可以支持海量的数据存储。由于Mongo可以支持复杂的数据结构,而且带有强大的数据查询功能,因此非常受到欢迎。
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
主要特点
MongoDB的提供了一个面向文档存储,操作起来比较简单和容易。
- 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi 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安装简单。
2、适用场景
1、网站数据:适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
2、缓存:由于性能很高,也适合作为信息基础设施的缓存层。在系统重启之后,搭建的持久化缓存可以避免下层的数据源过载。
3、大尺寸、低价值的数据:使用传统的关系数据库存储一些数据时可能会比较贵,在此之前,很多程序员往往会选择传统的文件进行存储。
4、高伸缩性的场景:非常适合由数十或者数百台服务器组成的数据库。
5、用于对象及JSON数据的存储:MongoDB的BSON数据格式非常适合文档格式化的存储及查询。
3、应用案例
1、京东,中国著名电商,使用MongoDB存储商品信息,支持比价和关注功能.
2、赶集网,中国著名分类信息网站,使用MongoDB记录pv浏览计数
3、奇虎360,著名病毒软件防护和移动应用平台,使用MongoBD支撑的HULK平台每天接受200亿次的查询.
4、百度云,使用MongoDB管理百度云盘中500亿条关于文件源信息的记录.
5、CERN,著名的粒子物理研究所,欧洲核子研究中心大型强子对撞机的数据使用MongoDB
6、纽约时报,领先的在线新闻门户网站之一,使用MongoDB
7、sourceforge.net,资源网站查找,创建和发布开源软件免费,使用MongoDB的后端存储
4、不适合场景
1、高度事物性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
2、传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
3、需要SQL的问题
--------------------MongoDB介绍---------------------
1、数据库
1、一个集合的物理容器。一个单一的MongoDB服务器通常有多个数据库。
2、MongoDB中多个文档组成集合,同样多个集合可以组成数据库。一个MongoDB实例可以承载多个数据库,它们之间可视为完全独立的。每个数据库都有独立的权限控制,即便是在磁盘上,不同的数据库也放置在不同的文件中。将一个应用的所有数据都存储在同一个数据库中的做法就很好。要想在同一个MongoDB服务器上存放多个应用或者用户的数据,就要使用不同的数据库了。
3、命名规则
1、不能是空字符串("")。
2、不得含有''(空格)、.、$、/、\和\0(空字符)。
3、应全部小写。
4、最多64字节。
5、保留的数据库名:admim local config
2、集合
集合就是一组文档。如果说MongoDB中的文档类似于关系型数据库中的行,那么集合就如同表。
1、无模式
集合是无模式的。这意味着一个集合里面的文档可以是各式各样的。
2、命名
1、集合名不能是空字符串""。
2、集合名不能还有\0字符(空字符),这个字符表示集合名的结尾
3、集合名不能以"system"开头,这是为系统集合保留的前缀。
4、用户创建的集合名字不能含有保留字符$。有些驱动程序的确支持在集合名里面包含$。这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
3、子集合
组织集合的一种惯例是使用"."字符分开的安命名空间划分的子集合。例如一个带有博客功能的应用可能包含两个集合,分别是blog.posts和blog.authors。这样做的目的只是为了组织结构更好些,也就是说blog这个集合及其子集合没有任何关系。
3、文档
文档是MongoDB的核心概念。多个键及其关联的值有序的放置在一起便是文档。
每种编程语言表示文档的方法不一样,但是大多数编程语言都有相通的一种数据结构,比如映射、散列或字典。
规范:
1、键不能包含\0(空字符)。这个字符用来表示键的结尾
2、.和$有特别的意义,只有在特定环境下才使用。
3、以下划线"_"开头的键是保留的,虽然这个并不是严格的要求。
MongoDB不但区分类型,也区分大小写。
MongoDB的文档中不能有重复的键。
4、RDBMS VS MongoDB对应表
SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据属性/字段(域)
index index 索引
table joins Embedded Documents 表连接,MongoDB3.2提供了Join操作
primary key primary key 主键,MongoDB默认自动将_id字段设置为主键,可以手动设置
5、注:_id是一个12字节的十六进制数,保证每一份文件的唯一性
1、前4个字节为当前时间戳。
2、未来3个字节的机器ID。
3、接下来的2个字节的MongoDB的服务进程id。
4、剩余3个字节是简单的增量值。