2、MongoDB简介
对于社交类软件的功能,我们需要对它的功能特点做分析:
- 数据量会随着用户数增大而增大
- 读多写少
- 价值较低
- 非好友看不到其动态内容
- 地理位置的查询
- ……
针对以上特点,我们来分析一下:
- mysql:关系型数据库(效率低)
- redis:redis缓存(微博,效率高,数据格式不丰富)
- 对于数据量大而言,显然不能够使用关系型数据库进行存储,我们需要通过MongoDB进行存储
- 对于读多写少的应用,需要减少读取的成本
- 比如说,一条SQL语句,单张表查询一定比多张表查询要快
探花交友
- mongodb:存储业务数据(圈子,推荐的数据,小视频数据,点赞,评论等)
- redis:承担的角色是缓存层(提升查询效率)
- mysql:存储和核心业务数据,账户
1.1、MongoDB简介
MongoDB:是一个高效的非关系型数据库(不支持表关系:只能操作单表)
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
MongoDB最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
官网:MongoDB: The Developer Data Platform | MongoDB
1.2、MongoDB的特点
MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文档型数据库。具体特点总结如下:
- 面向集合存储,易于存储对象类型的数据
- 模式自由
- 支持动态查询
- 支持完全索引,包含内部对象
- 支持复制和故障恢复
- 使用高效的二进制数据存储,包括大型对象(如视频等)
- 自动处理碎片,以支持云计算层次的扩展性
- 支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++语言的驱动程 序, 社区中也提供了对Erlang及.NET 等平台的驱动程序
- 文件存储格式为 BSON(一种 JSON 的扩展)
1.2.1、通过docker安装MongoDB
在课程资料的虚拟机中已经提供了MongoDB的镜像和容器,我们只需要使用简单的命令即可启动
#进入base目录
cd /root/docker-file/base/
#批量创建启动容器,其中已经包含了redis,zookeeper,mongodb容器
docker-compose up -d
#查看容器
docker ps -a
可以看到mongoDB已经启动,对外暴露了27017的操作端口
1.2.2、MongoDB体系结构
MongoDB 的逻辑结构是一种层次结构。主要由: 文档(document)、集合(collection)、数据库(database)这三部分组成的。逻辑结构是面 向用户的,用户使用 MongoDB 开发应用程序使用的就是逻辑结构。
- MongoDB 的文档(document),相当于关系数据库中的一行记录。
- 多个文档组成一个集合(collection),相当于关系数据库的表。
- 多个集合(collection),逻辑上组织在一起,就是数据库(database)。
- 一个 MongoDB 实例支持多个数据库(database)。 文档(document)、集合(collection)、数据库(database)的层次结构如下图:
为了更好的理解,下面与SQL中的概念进行对比:
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 表中的一条数据 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
1.3 数据类型
- 数据格式:BSON {aa:bb}
- null:用于表示空值或者不存在的字段,{“x”:null}
- 布尔型:布尔类型有两个值true和false,{“x”:true}
- 数值:shell默认使用64为浮点型数值。{“x”:3.14}或{“x”:3}。对于整型值,可以使用 NumberInt(4字节符号整数)或NumberLong(8字节符号整数), {“x”:NumberInt(“3”)}{“x”:NumberLong(“3”)}
- 字符串:UTF-8字符串都可以表示为字符串类型的数据,{“x”:“呵呵”}
- 日期:日期被存储为自新纪元依赖经过的毫秒数,不存储时区,{“x”:new Date()}
- 正则表达式:查询时,使用正则表达式作为限定条件,语法与JavaScript的正则表达式相 同,{“x”:/[abc]/}
- 数组:数据列表或数据集可以表示为数组,{“x”: [“a“,“b”,”c”]}
- 内嵌文档:文档可以嵌套其他文档,被嵌套的文档作为值来处理,{“x”:{“y”:3 }}
- 对象Id:对象id是一个12字节的字符串,是文档的唯一标识,{“x”: objectId() }
- 二进制数据:二进制数据是一个任意字节的字符串。它不能直接在shell中使用。如果要 将非utf-字符保存到数据库中,二进制数据是唯一的方式。
3、MongoDB入门
2.1、数据库以及表的操作
1. #查看所有的数据库 2. > show dbs 3. 4. #通过use关键字切换数据库 5. > use admin 6. 7. #创建数据库 8. #说明:在MongoDB中,数据库是自动创建的,通过use切换到新数据库中,进行插入数据即可自动创建数据库 9. > use testdb 10. 11. > show dbs #并没有创建数据库 12. 13. > db.user.insert({id:1,name:'zhangsan'}) #插入数据 14. 15. > show dbs 16. 17. #查看表 18. > show tables 19. 20. > show collections 21. 22. #删除集合(表) 23. > db.user.drop() 24. true #如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。 25. 26. #删除数据库 27. > use testdb #先切换到要删除的数据中 28. 29. > db.dropDatabase() #删除数据库
2.2、新增数据
在MongoDB中,存储的文档结构是一种类似于json的结构,称之为bson(全称为:Binary JSON)。
1. #插入数据 2. #语法:db.表名.insert(json字符串) 3. 4. > db.user.insert({id:1,username:'zhangsan',age:20}) 5. 6. 7. > db.user.find() #查询数据
2.3、更新数据
update() 方法用于更新已存在的文档。语法格式如下:
1. db.collection.update( 2. <query>, 3. <update>, 4. [ 5. upsert: <boolean>, 6. multi: <boolean>, 7. writeConcern: <document> 8. ] 9. )
参数说明:
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如$,$inc.$set)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
1. #查询全部 2. > db.user.find() 3. 4. #更新数据 5. > db.user.update({id:1},{$set:{age:22}}) 6. 7. #注意:如果这样写,会删除掉其他的字段 8. > db.user.update({id:1},{age:25}) 9. 10. #更新不存在的字段,会新增字段 11. > db.user.update({id:2},{$set:{sex:1}}) #更新数据 12. 13. #更新不存在的数据,默认不会新增数据 14. > db.user.update({id:3},{$set:{sex:1}}) 15. 16. #如果设置第一个参数为true,就是新增数据 17. > db.user.update({id:3},{$set:{sex:1}},true)