MongoDB数据库总结
什么是MongoDB ?
MongoDB是基于文档的存储的(而非表),是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。模式自由(schema-free),意味着对于存储在MongoDB数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。 Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB的安装 MongoDB的特点 MongoDB应用案例有哪些?
MongoDB安装:
MongDB的配置可以参考这个: http://blog.****.net/fdipzone/article/details/7442162
MongoDB数据库的特点:
1. MongoDB是一个独立的服务器。 如MySQL或PostreSQL 一样,MongoDB提供侦听端口以便接入。它提供了用于查询,创建,更新和删除的工具。从理论上讲,你使用它的工作方式相同:连接,执行任务并关闭连接。
2.它是基于文档的,而不是基于表格的。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
3.它是非结构化的。MongoDB没有很多查询语句。在大多数情况下,只需给它一个数组指定你想要的信息,然后它会给你返回文档的数组。如果你想运行一些非常复杂的查询(如Map-Reduce操作),可以向MongoDB传递JavaScript,其内部的JavaScript引擎可以解析这个脚本。
4.高性能、易部署、易使用,存储数据非常方便。
5. 支持完全索引,包含内部对象。
6.它具有强大的主流开发语言支持,如C#、C++、Java、PHP、Perl、Python、Ruby。
MongoDB适用场景?
1、京东,中国著名电商,使用MongoDB存储商品信息,支持比价和关注功能.
2、赶集网,中国著名分类信息网站,使用MongoDB记录pv浏览计数
3、奇虎360,著名病毒软件防护和移动应用平台,使用MongoBD支撑的HULK平台每天接受200亿次的查询.
4、百度云,使用MongoDB管理百度云盘中500亿条关于文件源信息的记录.
5、CERN,著名的粒子物理研究所,欧洲核子研究中心大型强子对撞机的数据使用MongoDB
6、纽约时报,领先的在线新闻门户网站之一,使用MongoDB
7、sourceforge.net,资源网站查找,创建和发布开源软件免费,使用MongoDB的后端存储。
关系型数据库和非关系型数据库区别?
关系型数据库,是指采用了关系模型来组织数据的数据库。 关系模型是在1970年由IBM的研究员E.F.Codd博士首先提出的,在之后的几十年中,关系模型的概念得到了充分的发展并逐渐成为主流数据库结构的主流模型。 简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。 常用关系型数据库有Oracle、SQLServer、Sybase、Informix、access、DB2、mysql等 非关系型数据库有 MongoDB、CouchDB、 Tokoy Tyrant、Voldemort等
关系型数据库优点
容易理解:二维表结构是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型来说更容易理解 使用方便:通用的SQL语言使得操作关系型数据库非常方便 易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率
关系型数据库瓶颈
高并发读写需求
网站的用户并发性非常高,往往达到每秒上万次读写请求, 对于传统关系型数据库来说,硬盘I/O是一个很大的瓶颈
海量数据的高效率读写
网站每天产生的数据量是巨大的,对于关系型数据库来说,在一张包含海量数据的表中查询,效率是非常低的
高扩展性和可用性
在基于web的结构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移。
对网站来说,关系型数据库的很多特性不再需要了
事务一致性
关系型数据库在对事物一致性的维护中有很大的开销,而现在很多web2.0系统对事物的读写一致性都不高
读写实时性
对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出这条数据的,但是对于很多web应用来说,并不要求这么高的实时性,比如发一条消息之后,过几秒乃至十几秒之后才看到这条动态是完全可以接受的 复杂SQL,特别是多表关联查询
MongoDB的数据类型?
null
null用于表示空值或者不存在的字段。 {"x":null}
布尔
布尔类型有两个值'true'和'false1'. {"X":true}
32位整数
类型不可用。JavaScript仅支持64位浮点数,所以32位整数会被自动转换。
64位整数
不支持这个类型。shell会使用一个特殊的内嵌文档来显示64位整数
64位浮点数
shell中的数字都是这种类型。下面的表示都是浮点数: {"X" : 3.1415926} {"X" : 3}
字符串
UTF-8字符串都可表示为字符串类型的数据: {"x" : "foobar"}
符号
不支持这种类型。shell将数据库里的符号类型转换成字符串。
对象id
对象id是文档的12字节的唯一 ID, {"X" :ObjectId() }
日期
日期类型存储的是从标准纪元开始的毫秒数。不存储时区: {"X" : new Date()}
正则表达式
文档中可以包含正则表达式,采用JavaScript的正则表达式语法: {"x" : /foobar/i}
代码 文档中还可以包含JavaScript代码:{"x" : function() { /* …… */ }}
二进制数据
二进制数据可以由任意字节的串组成。不过shell中无法使用。
最大值
BSON包括一个特殊类型,表示可能的最大值。shell中没有这个类型。
最小值
BSON包括一个特殊类型,表示可能的最小值。shell中没有这个类型。
未定义
文档中也可以使用未定义类型:{"x":undefined}
数组
值的集合或者列表可以表示成数组:{"x" : ["a", "b", "c"]}
MongoDB常用Sql语言?
查询篇
show dbs 查看数据库
db.cloneDatabase(“127.0.0.1”) 将指定机器上的数据库的数据克隆到当前数据库
db.copyDatabase("mydb", "temp", 127.0.0.1") 将本机的mydb的数据复制到temp数据库中
db.repairDatabase()修复当前数据库
db.getName() 查看当前使用数据库
db.version() 查看数据库版本
db.getMongo()查看当前db的链接机器地址
db.userInfo.find() 相当于:select* from userInfo db.userInfo.distinct("name") 会过滤掉name中的相同数据
相当于:select distict name from userInfo db.userInfo.find({"age": 22}) 条件查询
相当于:select * from userInfo where age = 22 db.userInfo.find({name: /mongo/});模糊查询
相当于:select * from userInfo where name like ‘%mongo%'
db.userInfo.find({}, {name: 1, age: 1})
相当于:select name, age from userInfo
查询指定列name、age数据 升序:db.userInfo.find().sort({age: 1}) 降序:db.userInfo.find().sort({age: -1})
查询name = zhangsan, age = 22的数据
db.userInfo.find({name: 'zhangsan', age: 22})
相当于:select * from userInfo where name = 'zhangsan' and age = '22'
分页:db.userInfo.find().limit(10).skip(5) select * from userInfo limit 10,5
插入更新篇
db.users.save({name: ‘zhangsan', age: 25, sex: true});
添加 db.users.insert({name: ‘zhangsan', age: 25, sex: true});
添加 insert 和save 都是添加 db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true);
相当于:update users set name = ‘changeName' where age = 25;
修改age=25 db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);
相当于:update users set age = age + 50, name = ‘hoho' where name = ‘Lisi';
增加字段篇
db.url.update({}, {$set: {content:""}}, {multi: 1}) ‘userinfo’表的名称 ‘content’ 字段名称
增加字段 db.url.update({age:”21”}, {$set: {content:""}}, {multi: 1}) ‘age’筛选条件‘userinfo’表的名称 ‘content’
字段名称 增加字段 db.url.update({},{$unset:{'content':''}},false, true)
删除篇
条件删除
db.users.remove({age: 132});
删除当前数据库
db.dropDatabase()
删除所有数据
db.col.remove({})
MongoDB中insert和save的区别?
若新增的数据中存在主键 ,insert() 会提示错误,而save() 则更改原来的内容为新内容。 如: 已存在数据:{_id : 1, " name " : " n1 " },再次进行插入操作时, insert({_id : 1, " name " : " n2 " }) 会报主键重复的错误提示 save({ _id : 1, " name " : " n2 " })会把 n1 修改为n2。 相同点: 若新增的数据中没有主键时,会增加一条记录。
什么是MongoDB 索引?
db.userInfo.ensureIndex({name: 1});创建索引
db.userInfo.getIndexes();查询当前索引
db.userInfo.totalIndexSize();查看总索引记录大小
db.users.dropIndex("name_1");删除当前索引
db.users.dropIndexes();删除所有索引
什么是MongoDB 聚合?
count 函数 distinct 函数 group 函数 集合的count函数是最简单的聚合函数,返回集合中文档的数量。 $sum 计算总和。 $avg 计算平均值。 $min 获取集合中所有文档对应值得最小值。 $max 获取集合中所有文档对应值得最大值。 $push 在结果文档中插入值到一个数组中。 $addToSet 在结果文档中插入值到一个数组中,但不创建副本。 $first 根据资源文档的排序获取第一个文档数据。 $last 根据资源文档的排序获取最后一个文档数据。
为什么使用MongoDB分片?
分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。 为什么使用分片? 复制所有的写入操作到主节点 延迟的敏感数据会在主节点查询 单个副本集限制在12个节点 当请求量巨大时会出现内存不足。 本地磁盘不足 垂直扩展价格昂贵
用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障 Config Server: mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。 Query Routers: 前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
欢迎大家加入 “码农新锐”公众号,更多技术资料等着您。