1.常见的NoSQL数据库 Redis、

HBase、MongoDB、InfoGrid

2.NoSQL定义及特点

全称是Not Only Sql ,是非关系型数据存储的广义定义。它存储的不再是结构化的数据,即数据再没有固定的长度,类型和固定的格式等,比较主流的是以key-value键值对存储

3.非结构化数据库类型

文档存储数据库、键\值数据库、列存储数据库、图存储数据库

4、NoSQL中的概念与关系数据库的对应关系

在这里插入图片描述

5、数据库、集合、文档

多个键及其关联的值有序地放置在一起就是文档
一组没有固定结构的文档就是集合
多个集合组成数据库

6、什么是固定集合

性能出色且有固定大小的集合,在创建是“capped”参数为‘true’,且max为最大值时,新文档会替换最先进入集合的老文档,产生的文档集合为固定集合

7、固定集合与普通集合的区别

普通集合:集合里的文档可以是多种多样的;没有表头,无结构,自动识别每个字段的类型
固定集合: 是性能出色且有着固定大小的集合,事先创建好了,大小固定的集合;固定集合很像环形队列,如果空间不足,最早的文档就会被删除,为新的文档腾出空间。

8、什么是内嵌文档

把整个MongDB文档作为另一个文档中键的值称为内嵌文档。

9、MongoDB的存储原理?

MongoDB的所有数据实际上是存放在硬盘的,然后把部分或者全部要操作的数据通过内存映射存储引擎映射到内存中。
读操作:直接从内存中取数据(尽可能的放在内存中)
写操作:修改内存中对应的数据( 0S的虚拟内存管理器把数据重新保存到硬盘中)只修改内存中的数据

10、MapReduce的三个过程?

Map,shuffle,Reduce
(1)Map:映射,将大的分布切片分割,分配给不同的map
(2)shuffle:洗牌,重新分配,排列、组合
(3)Reduce:归并,把数据映射到分区,进行统计归并

11、部署一个分片集群需要几大部分?

Shard Server、Config Server、Router Process
Shard Server :用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障
Config Server :mongod实例,存储了整个 C1usterMetadata ,其中包括chunk信息。
Router Process:前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

  • 集合
    一组没有固定结构的文档就是集合

  • 主从复制

  • 分片
    将数据进行拆分,把数据分散的保存在不同的机器上的过程,MongoDB实现了自动分片的功能,能够自动地切换数据和做负载均衡

  • GridFS
    是大文件存储系统,它能够将超过16MB的文件分割,保存,对大型数据进行分块处理,然后将这些切分后的小文档,保存在数据库中(分片的依据是片键,分为:fs.files,fs.chunks两个文件)

  • 聚合
    对文档进行过滤、查询

  • 固定集合
    性能出色且有固定大小的集合,在创建是“capped”参数为‘true’,且max为最大值时,新文档会替换最先进入集合的老文档,产生的文档集合为固定集合

  • 内嵌文档
    把整个MongDB文档作为另一个文档中键的值称为内嵌文档。

  • 聚合管道
    通过数据处理管道来实现,一次操作可以使用多个管道来处理数据文档,使用管道是有顺序的,会依照管道的序列,将管道的结果传递给下一个管道中继处理,最后显示结果。

  • 地理空间索引
    找到距离当前最近的N个场所,为坐标查询提供专门索引,基于位置服务,能够帮助我们在包含地理空间形状和点集的集合上,高效地执行空间查询的索引

  • 部署MongoDB分片集群的步骤
    (1)创建配置服务器
    (2)启动查询路由器
    (3)在集群中添加分布服务器
    (4)对数据库启用分片
    (5)对集合启用分片
    在这里插入图片描述

db. GeoJson.createIndex({personloc:'2dsphere'},{name:” personloc”});  

db.runCommand({  
    geoNear:' GeoJson ',  
    near:{type:'Point',coordinates:[116.403981,39.914935]},  
    spherical:true,  
    minDistance:100,  
    maxDistance:3000  
});
db.educoder.aggregate([{$group:{_id:'$author',first_course:{$first:'$course'}}}]);  

db.educoder.aggregate([{$group:{_id:'$author',learning_avg:{$avg:'$learning_num'}}}]);  

db.educoder.aggregate([{$unwind:'\$tags'},{$group:{_id:'$tags',course_num:{$sum:1}}}]);

1.在编号大于2000的文档中,将相同单位的重量求和,即筛选“SysNo”大于2000的文档,将相同字段“ProductMode”的“Weight”求和,并将结果保存到“Produce_Mapreduce”集合中;

var mapFunction = function()
{
    emit(this.ProductMode,this.Weight);
}
var reduceFunction = function(key,values)
{
    var total=0;
    for(var i=0; i<values.length; i++)
    {
        total+=values[i];
    }
    return total;
}
db.produce.mapReduce(
                    mapFunction;
                    reduceFunction;
                    {
                    query:{SysNo:{$gt:2000}};
                    out:"Produce_Mapreduce"
                    }
)

2.

在这里插入图片描述
①创建三个 shard sever。命令代表: mkdir

②创建配置文件。分别为三台服务器创建配置文件内容中 shard ever 必须为 True

③从配置文件启动 mongodb 服务。

④启动 MongoDB shell

⑤导入数据集添加分片并启动 mangos,然后对分片进行初始化。

⑥验证分片,将对应数据集_id 字段设置为片键

3.Nosql定义

NOSQL是指“不仅仅是SQL”,这旨在强调一点的是:NOSQL数据库并非SQL的替代品,它实际上也可使用类似于SQL的查询概念。
NOSQL的全称是Not Only Sql,是非关系型数据存储的广义定义。它存储的不再是结构化的数据,即数据再没有固定的长度,类型和固定的格式等,比较主流的是以key-value键值对存储

数据表→ JDBC读取→ POJO(VO、PO)→控制层转化为JSON数据→客户端

4.Nosql缺点

(1)不提供对sql的支持

(2)支持的特性不够丰富(不支持事务,不支持多表联查)

(3)现有的NOSQL产品,相对于已有的Mysql,Oracle等关系型数据库来说成熟度不高。

5.在这里插入图片描述

db.test.insert({
	name: '张小凡', 
    sex: '女',
    age: 20,
    department: { id: 1,name: “研发部”,工资:8000}
})

6.MongoDB特点

1.数据文件存储格式为BSON(JSON的扩展)
例如:BSON格式

{ 				name:New Project”,
                version: 1,
                languages: {JavaScript,”HTML”,”CSS},
                admin: {name:Brad,password:****},
                paths: {temp:/tmp”,project:/opt/project”,
                html:/opt/project/html”}
  }

在此文档结构中,包含类型为:字符串、整数、数组和对象的字段、属性,跟Javascript对象是一样的。
2.面向集合存储,易于存储对象类型和JSON形式的数据
所谓集合(collection)优点类似一张表格,区别在于集合没有固定的表头。
3.模式自由
一个集合中可以存储一个键值对的文档,也可以存储多个键值对的文档,还可以存储键不一样的文档,而且在生产环境下可以轻松增减字段而不影响现有程序的运行
4.支持动态查询
MongoDB支持丰富的查询表达式,查询语句使用JSON形式作为参数,可以很方便的查询内嵌文档和对象数组。
5.完整的索引支持
6.支持复制和故障恢复
7.二进制数据存储
8.自动分片(支持水平的数据库集群,可动态添加机器。)
分片的功能实现海亮数据的分布式存储,分片通常与复制集配合起来使用,实现读写分离,负载均衡,如何选择片键是实现分片功能的关键
9.支持多种语言
10.使用的是内存映射存储引擎

7.MongoDB基础知识

1、MongoDB中数据库、集合、文档的概念?关系?
数据库包含集合,集合包含文档
2、MongoDB中的基本类型,日期类型用什么表示?
ISODate
3、MongoDB的存储引擎包括哪些?
MMAP引擎,inMemory引擎,wriedTiger引擎
4、MongoDB的工作原理?
MongoDB的所有数据实际上是存放在硬盘的,然后把部分或者全部要操作的数据通过内存映射存储引擎映射到内存中
5、在MongoDB中数据存储的格式是JSON

10、GridFS工作原理

在GridFS存储文件是将文件分块存储,文件会按照256KB的大小分割成多个块进行存储,GridFS使用两个集合(collection)存储文件,一个集合是chunks,用于存储文件的二进制数据;一个集合是files,用于存储文件的元数据(文件名称,大小,上传时间等信息)。

11、MongoDB使用GridFS的优缺点

优点
1:能够简化技术栈,如果已经使用了MongoDB,那么使用GridFS,就不需要其它独立的存储工具了

2:GridFS会自动平衡已有的复制,或者为MongoDB设置的自动分片,所以对文件存储做故障转移或者是横向扩展会更容易 。

3:GridFS的功能不错,能自动解决一些其他文件系统遇到的问题,如在同一个目录下存储大量的文件

缺点
1: 性能较低,不如直接访问文件系统快。

2:无法修改文档。如果要修改GridFS里面的文档,只能是先删除再添加

12、文档的增、删、改、查

1、在文档中插入数据insert与save的区别?
如果我们在插入数据的时候不添加一个主键时,系统会随机分配一个主键,则不存在下面所说的情况,若新增的数据中存在主键,则再次插入相同的主键时insert() 会提示错误,而save() 则更改原来的内容为新内容。
当遇到_id相同的情况下save完成保存操作insert则会报错

2、查询
在student集合中,查找年龄小于20岁的学生信息

db.student.find({sage:{$lt:20}})

在student集合中,查找出Jim的最后一本书

db.student.find({{sname:”Jim”},{books:{$slice:-1}}})

假设mdb集合中_id为“2012014”的文档已经存在,请在mdb集合中插入以下数据:
{“_id”:“202103105”,“name”:“徐金鑫”,age:23,“books”:[MongoDB,Python,C++]}

db.mdb.save({"_id":"202103105","name":"徐金鑫",age:23,"books":[MongoDB,Python,C++]})

查询出persons数据集中的所有数据,不显示_id;

db.persons.find({},{_id:0})

查询出persons集合中的年龄大于25岁同学的信息;

db.persons({age:{$gt:25}});

利用聚合管道aggregate方法操作persons数据集,统计出“范明硕”books中的元素个数;

db.persons.aggregate([{$match:{name:"范明硕"}},
{$project:{'书籍数量':{$size:'$books'}}}])

统计persons数据集合中年龄大于23岁学生的年龄和人数;

db.getCollection('persons').aggregate([{$group:{_id:"$age",total:{$sum:1}}}])

修改persons数据集合中所有男同学的年龄减少1岁;

 db.persons.update({sex:”男”},{$inc:{sage:-1}}falsetrue)    

在persons数据集合中,给姓”王”的同学追加一本“语文”书籍;

db.persons.update({})

删除persons数据集合中sname是“徐金鑫”的文档;

db.persons.remove({sname:”徐金鑫”})

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.假设mdb集合中_id为“2012014”的文档已经存在,请在mdb集合中插入以下数据:
{“_id”:“202103105”,“name”:“徐金鑫”,age:23,“books”:[MongoDB,Python,C++]}(使用命令save进行写入)

db.mdb.save({"_id":"202103105","name":"徐金鑫",age:23,"books":[MongoDB,Python,C++]})

2.查询出mdb集合中的年龄大于等于27岁同学的信息;

 db.persons({age:{$gt:27}}); //gt为大于

3.查询出mdb集合中拥有4本书的学生信息;($where)

db.persons.find({$where:"this.books.length>=4"}) 

4. 利用聚合管道操作mdb集合,统计出jim喜欢看书的数量;

db.persons.aggregate([{'$match':{name:'jim'}}, {'$project':{ '_id':0,'name':1,'数量':{'$size':'$books'}} }]) 

5.将mdb集合中的zhaoliu同学的年龄增加1岁;

db.persons.update({name:"zhaoliu"},{$inc:{age:1}})

6.在mdb集合中,给“zhangsan”同学增加他的父母信息,并将各自父母亲的姓名、职业、年龄等信息录入内嵌文档;例如:{“name”:“张传”,“关系”:“父亲”,“工作”:“教授”},{“name”:“孙一丽”,“关系”:“母亲”,“工作”:“处长”}

在这里插入代码片

7.删除mdb集合中name是“Jim”的记录;

db.persons.remove(name:"Jim"})

8.为mdb集合中的name和age创建唯一索引,并按sname升序、sage降序排序;

db.persons.ensureIndex({sname:1,sage:-1},{unique:true,name:"mdb.Index"})

9.查询出mdb集合中名字中存在”li”的学生的信息;

db.student.find({sname:/li/g},{_id:0,sname:1}) 

10.利用命令创建mytest数据库,并在该数据库下创建固定集合col。

use mytest
db.createCollection("col")
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐