nosql之MongoDB总结

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秒如若没有数据更新,便认为主机宕机):

*8、分片

发布了11 篇原创文章 · 获赞 5 · 访问量 735

猜你喜欢

转载自blog.csdn.net/JAVA_php_Jack/article/details/102714983