MongoDB简介
MongoDB是一种强大、灵活、可扩展的开源数据库。由C++编写旨在为WEB应用提供可拓展,高性能数据存储解决方案,MongoDB是一个介于关系数据库和非关系数据库之间的产品.它扩展了关系型数据库的众多有用功能,如辅助索引、范围査询(rangequery)和排序。MongoDB的功能非常丰富,比如内置的对MapReduce式聚合的支持,以及对地理空间索引的支持.
丰富的数据模型
MongoDB是面向文档的数据库,不是关系型数据库。放弃关系模型的主要原因就是为了获得更加方便的扩展性,当然还有其他好处。
容易扩展
MongoDB从最初设计的时候就考虑到了扩展的问题。它所采用的面向文档的数据模型使其可以自动在多台服务器之间分割数据。它还可以平衡集群的数据和负载,自动重排文档。这样开发者就可以专注于编写应用,而不是考虑如何扩展。要是需要更大的容量,只需在集群中添加新机器,然后让数据库来处理剩下的事。
功能丰富
索引 MongoDB支持通用辅助索引,能进行多种快速査询,也提供唯一的、复合的和地理空间索引能力。
存储 JavaScript开发人员不必使用存储过程了,可以直接在服务端存取JavaScript的函数和值。
聚合 MongoDB支持MapReduce和其他聚合工具。
固定集合 集合的大小是有上限的,这对某些类型的数据(比如日志)特別有用。
文件存储MongoDB支持用一种容易使用的协议存储大型文件和文件的元数据。有些关系型数据库的常见功能MongoDB并不具备,比如联接(join)和复杂的多行事务。这个架构上的考虑是为了提髙扩展性,因为这两个功能实在很难在一个分布式系统上实现。
不牺牲速度
卓越的性能是MongoDB的主要目标,也极大地影响了设计上的很多决定。MongoDB使用MongoDB传输协议作为与服务器交互的主要方式(与之对应的协议需要更多的开销,如HTTP/REST)。它对文档进行动态填充,预分配数据文件,用空间换取性能的稳定。默认的存储引擎中使用了内存映射文件,将内存管理工作交给操作系统去处理。动态查询优化器会“记住”执行査询最高效的方式。总之,MongoDB在各个方面都充分考虑了性能。虽然MongoDB功能强大,尽量保持关系型数据库的众多特性,但是它并不是要具备所有的关系型数据库的功能。它尽可能地将服务器端处理逻辑交给客户端(由驱动程序或者用户的应用程序处理)。这样精简的设计使得MongoDB获得了非常好的性能。
简单管理
MongoDB尽量让服务器自治来简化数据库的管理。除了启动数据库服务器之外,几乎没有什么必要的管理操作。如果主服务器挂掉了,MongoDB会自动切换到备份服务器上,并且将备份服务器提升为活跃服务器。在分布式环境下,集群只需要知道有新增加的节点,就会自动集成和配置新节点。MongoDB的管理理念就是尽可能地让服务器自动配置,让用户能在需要的时候调整设置(但不强制)。
文档数据库概念
文档
文档(document)文档是MongoDB中数据的基本单元,非常类似于关系型数据库管理系统中的行,但是比传统行表示的信息更加复杂
{"name":"json","age":18,"sex":"male"}
概要
文档是一个键值对(key-value)(即BSON) MongoDB的文档不需要设置相同的字段,相同的字段不需要相同的数据类型
文档只有一个键 “name” 其对应的(value)为”json”一般会包含多个键值对
{"name":"json","age":18,"sex":"male"}
键值对有序
{"spoort":"football","adress":北京,"phone":"XXXXXXXXXXX"} {"spoort":"football","phone":"XXXXXXXXXXX","adress":北京} ##这是两个数据
区分大小写
{"name":"json","age":18,"sex":"male"} {"Name":"json","age":18,"sex":"male"} ## 这两个文档也是不同的
区别字符数字
{"name":"json","age":18,"sex":"male"} {"name":"json","age":"18","sex":"male"} ## 这两个文档也是不同的
命名
-
_id是系统保留的关键字,默认主键,该值集合必须唯一,且不可以更改.
-
键不能包含 或者空字符, 表示字符串结尾
-
不能以$开头
-
不能包含.(点号)
-
键是区别大小写的且不能重复 否则视为非法文档
{"address":"china","address":"USA"}
集合
集合(collection):这个在MongoDB中表示一组文档,类似于关系型数据库中的表,但是在MongoDB的表(就是集合)是没有模式的,你可以 将完全不同的文档放入到一个集合里,但是在实际使用中,为特定隐形规定一种模式.
无模式
集合在数据库中没有固定结构,可以插入不同的格式和类型的数据,通常情况下会有一定的关联性
{"spoort":"football","adress":北京,"phone":"XXXXXXXXXXX"} {"name":"json","age":18,"sex":"male"} ##文档的键值完全不同, MongoDB不做强制要求,让开发更灵活.但一般都是一个相关类型的文档.
命名
UTF字符串:
-
不能是空字符串(“”)
-
集合名不能包含 或者空字符, 表示字符串结尾
-
集合不能以“system.”开头.此前缀是系统本身保留的.
-
集合名不能包换$字符.有些驱动程序支持集合名里有这是系统生成 的
-
命名空间
把数据库添加到集合名字前面.中间用点号链接,得到集合的完全限定名,就是命名空间,如buyinplay.communtity点可以出现在集合名字buyinplay.communtity.reviews看作是community集合的子集可以帮我们更好的组织数据,使数据的结构更加清晰明了.
数据库
数据库(databases):在MongoDB中,一组集合可以组成一个数据库,一个MongoDB实例可以承载多个数据库,每个数据库都有独立的权限控制.
命名
- 数据库名不能是空字符(“”)
- 数据库名不能包含” 空格”、$、/、和 (空字符)
- 数据库名带字母的全小写
- 数据库名最多包含64个字节
数据类型
数据类型(data tpye):类似于JSON,只支持:null,布尔,数字 ,字符串,数组,和对象.
null
null:表示空值或者不存在的字段
{"x":"null"}
布尔
布尔值包括两个 true false
{"x":"true"}
数字
支持:
-
32位整数
-
64位整数
-
64位浮点数
{"x":"3.145"}
字符串
{"x":"heloworld"}
数组
{"x":["a","b","c"]}
_id和ObjectId
MongoDB中存储的文件必须有一个”_id”键,这个键的值可以是任何数据类型的,默认是一个objectId对象,在一个集合里面,每个文档都有唯一的”_id”值,来确保集合里面每个文档都能够唯一标识.
ObjectId
ObjectId是”_id” 是默认类型,不同的机器全局可以用同种方法生成他.这也是MongoDB采用ObjectId而不是其他比较常规的做法.(比如自动增长的主键)的原因
自动生成的_id
如果插入文档的时候没有指定”_id” 的值,系统会自动帮你创建一个.可以用MongoDB服务器来做这件事,冗长会在客户端由驱动程序完成.
日期
在JavaScropt中,Date对象用作MongoDB的日期类型,创建一个新的Date对象是用new Date 而不是Date() 调用构造函数实际上会返回对日期的字符纯表示不是真正的Date对象,MongoDB支持Date作为键的一个值
{"name":"jack","birthday":new Date()}
数组
数组是一组值,既可以作为有序对象(链表、栈或者队列)来操作,也可以作为无需对象(集合)来操作
{"circle":["pi":3.1415926]}
数组中包含不同的元素,MongDB可以理解这种数据结构,并且对数组内容进行修改。
内嵌文档
把整个文档作另外一个键的一个值
{ "name":"jack", "address":{ "stree":"XXXXXXXX", "city":"XXXXX" } }
MongoDB安装
下载安装包
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.4.tgz
解压安装包
tar -zxvfmongodb-linux-x86_64-4.0.4.tgz
重新命名
mv mongodb-linux-x86_64-4.0.4mongodb
目录解析
启动服务
./bin/mongod --dbpath /path/to/database --logpath /path/to/log --fork --port27017 参数解释: --dbpath数据存储目录 --logpath日志存储目录 --port运行端口(默认27017) --fork后台进程运行