mongoDB简介
1.MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
- 在高负载的情况下,添加更多的节点,可以保证服务器性能。
- MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
- MongoDB是一个文档存储数据库,将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
主要特征
1、高性能:提供JSON、Xml等可嵌入数据快速处理功能;提供文档的索引功能,以提高查找数据的速度(相对传统数据库而言)。
2、丰富的查询语言:为数据聚合、结构文档、地理空间提供丰富的查询功能。
3、高可用性:提供自动故障转移和数据冗余处理功能。
4、水平扩展能力:提供基于多服务器集群的分布式数据处理能力,具有处理时分主从和权衡(基于Hash自动推选)两种处理模式(意味可以处理大数据)。
5、多个存储引擎的支持:MongoDB提供多个存储引擎,如WiredTiger引擎、MMAPv1引擎和in-Memory,前两个为基于硬盘读写的存储引擎,后一个为基于内存的存储引擎。
6、mongodb基于硬盘数据处理,速度比SQL数据库提高10几倍;文档数据库的值具备复杂文档结构数据的处理能力,查询统计性能相对比键值数据库更强,具备大数据处理能力;无事务处理能力。
杂记
1、mongoDB官网:https://docs.mongodb.com
2、使用工具:robo 3t、studio 3t
3、推荐一个很有用的json工具网站:https://www.bejson.com
4、经典cap图:
5、看了cap图,其实mongdb可选择一致性和可用性,这个我在下面再说。
6、文档存储的缺点:
- 缺少约束
- 数据出现冗余
- 相对低效
MongoDB和传统数据库的比较
MongoDB0 | TRDB | 比较说明 |
---|---|---|
集合 | 表 | 一个集合对应一个表,MongoDB无须事先定义表结构 |
文档 | 行 | 一个文档类似于一个传统数据库一行记录,每个文档有一个特殊的_id,_id的值在文档所属集合中是唯一的,默认是MongoDB自己维护,也可以由程序员编程指定。 |
键值对 | 字段值 | 文档一个键值对类似于传统数据库的一个字段值,不过文档里的值可以嵌入更复杂的数据结构 |
MongoDB使用
集合名称定义规则
- 不能是空字符串,如“”
- 不得含有$、\0(空字符)
- 不能以“system.”开头,这是为系统集合保留的前缀
- 用“.”来组织子集合,如book.itbook
文档的键的定义规则
- 不能包含\0字符(含空字符),这个字符表示键的结束
- “.”和“$”是被保留的,只能在特定的环境下用
- 区分类型(如字符串和整数等),同时也区分大小写
- 键不能重复,在一条文档里起唯一作用
数据库建立
数据库类型
- Admin数据库:一个权限数据库,如果创建用户的时候将该用户添加到admin数据库中,那么该用户就自动继承了所有数据库的权限;
- Local数据库:这个数据库永远不会被负责,可以用来存储本地单台服务器的任意集合;
- Config数据库:当MongoDB使用分片模式时,config数据库在内部使用,用于保存分片的信息;
- Test数据库:MongoDB安装后的默认数据库,可以用于数据库命令的各种操作,包括测试;
- 自定义数据库:根据应用系统需要建立的业务数据库。
MongoDB数据库建立相关命令
1、创建自定义数据库:use 数据库名
2、查看数据库:show dbs
3、统计某数据库信息:db.stats()
insert()语句
插入语句,插入json。
可以传入多个键值对。
例:
db.数据库名.insert(
{
键1:值1,
键2:{
键3:值3,
键4:值4
},
键5:[键6:值6,键7:值7]
}
)
find()函数
操作符
操作 | 格式 |
---|---|
等于 | {:} |
小于 | {:{$lt:}} |
小于或等于 | {:{$lte:}} |
大于 | {:{$gt:}} |
大于或等于 | {:{$gte:}} |
不等于 | {:{$ne:}} |
or条件
db.col.find( { $or: [ { key1:value1 },{ key2:value2 } ] } ).pretty()
and和or联合使用
db.col.find({"likes":{$gt:50},$or:[{"by":"书"},{"title":"Mongodb"}]}).pretty()
模糊查询
1、查询title含有“教”的文档:db.col.find({title:/教/})
2、查询title字段以“教”开头的文档:db.col.find({title:/^教/})
3、查询title字段以“教”结尾的文档:db.col.find({title:/教$/})
update
1、修改一条简单文档(set关键字)
2、加法运算–$inc
3、乘法运算–$mul
4、更改字段名称–$rename
5、删除字段名称–unset
6、删除文档–remove(旧版本)
做了个删除标记,不是真正意义上的删除,这是做了一个删除标记,没有释放空间。
若要删除整个集合,采用db.数据库名.drop()方法的效率会更高;remove()方法,并不会释放空间,需要继续执行db.repairDatabase()或者db.runCommend({repairDatabase:1})来回收磁盘空间。
7、使用delete删除
remove()方法已经过时了,现在官方推荐使用deleteOne()和deleteMany()方法。
如删除集合下全部文档:
db.数据库名.deleteMany({})
删除status等于A的全部文档:
db.数据库名.deleteMany({status:“A”})
删除status等于D的一个文档:
db.数据库名.deleteOne({status:“D”})
索引
1、单一字段(健)索引
db.数据库名.createIndex(
{
name:1
}
)
2、字段值唯一索引
db.数据库名.createIndex(
{name:1},{uniqe:true}
)
//name这个字段值一定是唯一的
3、多字段索引
db.数据库名.createIndex(
{
name:1,sex:-1
}
)
聚合(分组)
为集合文档数据提供各种处理数据方法,并返回计算结果。MongoDB提供了三种方式来执行聚合命令:聚合管道方法,Map-reduce()方法,单一目标聚合方法。聚合相当于在mysql为group by关键字;
聚合管道方法
db.数据库名.aggregate{
[
{KaTeX parse error: Expected 'EOF', got '}' at position 14: match:{键1:值1}}̲,//拿出所有键1等于值1的数…group:{键名1:“KaTeX parse error: Expected '}', got 'EOF' at end of input: 键2",键名2:{sum:”$键3"}}//根据键2的值分为两个集合,并对键3的值求和
}
])
*7、复制—replication
mongodb数据库在实际生产环境下,都是基于多服务器集群运行,并进行相应的数据分布式处理。由此,必须考虑数据读写的可用性和安全性。如一台服务器出现故障时,应该保证MongoDB数据处理的正常运行。复制就是在解决上述问题而产生的,通过复杂功能可以实现:
- 多服务器数据冗余的备份操作
- 使备份数据的服务器具备额外提供独立访问请求的功能
- 当服务器出故障时,还能自动提供故障的转移,自动数据恢复
主节点与从节点
如何复制
oplog
心跳机制
oplog(2秒一次检测数据更新,10秒如若没有数据更新,便认为主机宕机):