**什么是MongoDB?**
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写,意在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
**关系型数据库遵循ACID规则**
1. A原子性
事务里的所有操作要么全部做完,要么都不做,实物成功的条件是事务里所有操作都成功,只要有一个操作失败,整个事务就是失败,需要回滚;
2. C一致性
例如现有完整性约束a+b=10,如果一个事务改变了a,那么必须得改变b,使得事务结束后依然满足a+b=10,否则事务失败。
3.I独立性
独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受提交事务的影响;
4.D持久性
持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。
**分布式系统**
分布式系统由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成。分布式系统是建立在网络之上的软件系统。正因为软件的特性,所以分布式系统具有高度的内聚性和透明性。分布式系统可以应用在不同的平台上如:PC、工作站、局域网和广域网上等;
**分布式计算的优点**
1.可靠性(容错)
一台服务器的系统崩溃并不影响到其余的服务器;
2.可扩展性
在分布式计算系统可以根据需要增加更多的机器;
3.资源共享
共享数据是必不可少的应用,如银行,预定系统;
4.灵活性
由于该系统是非常灵活的,让很容易安装、实施和调试新的服务;
5.更快的速度
分布式计算系统可以有多台计算机的计算能力,使得它比其他系统由更快的处理速度;
6.开放系统
由于它是开放的系统,本地或者远程都可以访问到该服务;
7.更高的性能:
相较于集中式计算机网络集群可以提供更高的性能(及更好的性价比)
分布式计算的缺点
1.故障排除
故障排除和诊断问题;
2.软件
更少的软件支持是分布式计算系统的主要缺点;
3.网络
网络基础设施的问题,包括:传输、高负载、信息丢失等。
4.安全性:
开发系统的特性让分布式计算系统存在着数据的安全性和共享的风险等问题;
什么是NoSQL?
NoSQL指的是非关系型的数据库,是对不同于传统的关系型数据库的数据库管理系统的统称。NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
为什么使用NoSQL?
今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL数据库的发展也却能很好的处理这些大的数据。
**RDBMS vs NoSQL**
**RDBMS **
- 高度组织化结构化数据
- 结构化查询语言(SQL) (SQL)
- 数据和关系都存储在单独的表中。
- 数据操纵语言,数据定义语言
- 严格的一致性
- 基础事务
**NoSQL **
- 代表着不仅仅是SQL
- 没有声明性查询语言
- 没有预定义的模式
-键 - 值对存储,列存储,文档存储,图形数据库
- 最终一致性,而非ACID属性
- 非结构化和不可预知的数据
- CAP定理
- 高性能,高可用性和可伸缩性
MongoDB主要特点
MongoDB的设计目标是高性能、可扩展、易部署、易使用,存储数据非常方便。其主要功能特性如下:
1.面向集合存储,容易存储对象类型的数据(在MongoDB中数据被分组存储在集合中,集合类似RDBMS中的表,一个集合中可以存储无限多的文档)
2.模式自由,采用无模式结构存储(在MongoDB中集合中存储的数据是无模式的文档,采用无模式存储数据是集合区别于RDBMs中的表的一个重要特征)
3.支持完全索引,可以在任意属性上建立索引,包含内部对象(MongoDB的索引和RDBMs的索引基本一样,可以在属性、内部对象上创建索引以提高查询的速度)
4.支持差选(MongoDB支持肺腑的差选操作,MongoDB几乎支持SQL中的大部分查询)
5.强大的聚合工具(MongoDB 除了提供丰富的查询功能外,还提供强大的聚合工具,如count、group 等,支持使用MapReduce 完成复杂的聚合任务)。
6.支持复制和数据恢复(MongoDB 支持主从复制机制,可以实现数据备份、故障恢复、读扩展等功能)
7.使用高效的二进制数据存储,包括大型对象(如视频)。使用二进制格式存储,可以保存任何类型的数据对象。
8.自动处理分片,以支持云计算层次的扩展(MongoDB 支持集群自动切分数据,对数据进行分片可以使集群存储更多的数据,实现更大的负载,也能保证存储的负载均衡)。
9.支持Perl、PHP、Java、C#、JavaScript、Ruby、C 和C++语言的驱动程序(MongoDB 提供了当前所有主流开发语言的数据库驱动包,开发人员可以轻松变成访问MongoDB 数据库)。
10.文件存储格式为BSON(JSON 的一种扩展)(BSON 是对二进制格式的JSON 的简称,BSON 支持文档和数组的嵌套)。
11.可以通过网络访问(可以通过网络远程访问MongoDB 数据库)。
MongoDB核心
在MongoDB中基本核心的概念是文档、集合、数据库,具体见下表:
MongoDB优点
- 高扩展性
- 分布式计算
- 低成本
- 架构灵活,半结构化数据
- 关系简洁,操作简单有效
MongoDB缺点
- 没有标准化
- 有限的查询功能
- 安全性有限
mongoDB安装
使用brew安装,此外也可以使用curl命令来下载安装:
brew install mongodb // sudo brew install mongodb
mac新手使用brew的时候一定要多注意执行命名之后的一些信息,如果需要修改MongoDB的配置信息可以执行命令mongod --config /usr/local/etc/mongod.conf;
mongoDB配置
数据库存储的默认目录根目录下的data/db;
mkdir -p /data/db // 需要创建一个目录,为MongoDB默认的数据写入目录
chown `id -u` /data/db // 给刚刚创建的目录给与可读可写的权限
mongo --dbpath dir_name // 也可以修改目录,dir_name为你的目录名字
MongoDB启动
用brew管理的软件,启动服务的命名相同
brew services start mongodb/mongod
如果出现“Successfully started ‘MongoDB’即表示启动成功;
MongoDB连接
成功启动之后执行mongo命令连接数据库,
成功出现上图所示内容,并且出现箭头表示数据库连接成功,如果没有连接成功的话可能是由于你之前使用并非正常关闭导致生成了mongod.mock文件,意思是数据库暂时性锁住了,可以找到该文件直接删除并重新启动,如果还是不行的话,可以使用命名
ps -aef|grep mongo //查看占有的进程
kill 9 id(进程号) //杀死不再使用的进程,尝试重新启动即可;
创建数据库
MongoDB有创建新的数据库的语法格式如下:
show databases/dbs //show 查看有哪些数据库
use local //use 创建数据库(如果数据库不存在,则创建数据库,否则切换到该数据库)
show collections //查看有哪些几个(collections相当于SQL中一个表)
db.createCollection('movie') //创建集合(相当于创建表)
删除数据库
MongoDB删除数据库的语法格式如下:
db.dropDatabase() //删除当前数据库,可以用use进行选择数据库来删除
db.collection.drop() //删除当前数据库中的集合collection
插入数据库
MongoDB使用insert()或save()方法向集合中插入数据,语法格式如下:
db.collection.insert(document) // 给集合collection中插入数据,如果该集合不在该数据库中,MongoDB会自动创建该集合并插入文档
db.collection.save(document) // 如果不指定_id字段 save()方法类似于insert()方法。如果指定_id字段,则会更新该_id的数据
insert插数据时有几点需要注意一下:
- 不用key-value需要用逗号隔开,而key:value中间是用冒号,按照标准的json格式来写
- 如果一个key有多个value,value要用[]。
- 整个‘数据库’要用{}括起来
- 如果不指定ID的话,数据库默认会自动创建一个ID号,在同一个数据库里,每个文档的ID号是不同的;
更改数据库
MongoDB使用update()和save()方法来更新集合中文档,语法如下:
update() 方法用于更新已存在的文档。语法格式如下:
db.collection.update(
<query>, // update的查询条件,类似sql update查询内where后面的
<update>, // update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
{
upsert: <boolean>, // 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入
multi: <boolean>, // 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新
writeConcern: <document> // 可选,抛出异常的级别
}
)
save() 方法通过传入的文档来替换已有文档。语法格式如下:
db.collection.save(
<document>, // 文档数据,如果与之前的文档全部value值都有变化则会重新创建,所以必须保留一部分value值相同才会更新;
{
writeConcern: <document> // 可选,抛出异常的级别;
}
)
查询数据库
MongoDB查询文档使用find()方法。find()方法以费结构化的方式来显示所有文档,可以传入各种不同的查询条件,查询数据的语法格式如下:
db.collection.find(query, projection)
query :可选,使用查询操作符指定查询条件;
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值,只需省略该参数即可(默认省略)
db.collection.find().pretty() // pretty() 方法以格式化的方式来显示所有文档
db.collection.findOne() // 只返回一条数据
进阶($type操作符/limit()/skip()/sort()/索引/分片/备份/监控/拓展)
db.collection.find().pretty() // 格式化输出
db.collection.find().count() // 查看集合中文档的个数
db.collection.find().skip() // 跳过指定数量的数据
db.collection.find().limit() // 读取指定记录的条数
db.collection.find().sort({key:1}) // 通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列
db.collection.getIndexes() // 查看集合索引情况
db.collection.dropIndexes() // 删除索引(不会删除 _id 索引)
db.collection.createIndex({key:1}) // 创建索引(参数key 为你要创建的索引字段,1为按升序创建索引,-1为按降序创建索引)
db.collection.aggregate($group) // 聚合主要用于处理数据(如平均值,求和等),并返回计算后的数据结果,类似sql语句中的 count(*)。
$gt 大于
$gte 大于等于
$lt 小于
$lte 小于等于
$ne 不等于
参考资料: