目录
一、MongoDb是什么
1.特点
2.功能
3.基本的指令
二、MongoDB的使用场景
1.适用场合
2.常见应用场景
三、可能遇到的问题
1.MongoDB是否支持事务?
2.MongoDB大数据迁移怎么做?
3.MongoDB的水平扩展是什么原理?
4.MongoDB出现负载过高的情况如何处理?
一、MongoDb是什么
MongoDB是高性能、开源、无模式的文档型数据库。它是一个非结构化介于关系和非关系数据库之间的产品,使用C++开发。
1.特点
1)面向集合
数据被分组存储在数据集中,被称为一个集合。每个集合在数据库中都有唯一一个标识名,并且可以包含无数个文档,其概念类似与关系型数据中的表即table。
2)模式自由
意味着存储在数据库中的数据,我们不需要知道它的任何结构定义即schema。
3)文档型
意思是我们存储的是键值对,键是字符串,值可以是数据集合类型中的任意类型,包括数组和文档。
逻辑体系架构:
2.功能
(1)面向集合的存储:适合存储对象和JSON形式的数据。
(2)动态查询:支持丰富的查询表达式,查询指令采用JSON形式的标记,可以轻松查询内嵌的对象及数组。
(3)完整的索引支持:包括内嵌的文档及数组。查询优化器能分析查询表达式生成高效的查询计划。
(4)查询监控:提供了一系列监视工具用以分析数据库操作性能。
(5)复制及自动故障转移:支持主-从模式及服务器之间的相互复制,目标是提供冗余及自动故障转移。
(6)高效的传统存储方式:支持二进制数据及大型对象。
(7)自动分片及支持云级别的伸缩性:自动分片支持水平的数据库集群,可以动态添加机器。
3.基本的指令
基本的操作命令和mysql极为类似
#显示当前所有的数据库
show dbsshow databases
#进入到指定的数据库中
use 数据库名
#当前处于哪个数据库
db
#查看数据库里面的所有集合
show collections
数据库的增删改查
#想数据库中插入文档
db.<集合名>.insert(doc) 示例:db.user.insert({name:"zs",age:"23"})
#查找集合中的内容
db.<集合名>.find() 示例:db.user.find() find可以接收一个对象作为条件参数
#修改集合中的内容
db.<集合名>.update(查询条件,新对象) 如果需要修改指定的属性需要使用“修改操作符”
$set 可以用来修改文档指定属性 示例:db.user.update({name:"zs"},$set{name:"ls"})$unset 删除文档中指定属性
#删除文档
db.<集合名>.remove()
二、MongoDB的使用场景
1.适用场合
(1)网站数据:非常适合实时的插入,更新和查询,并具备实时数据存储所需的复制及高度伸缩性
(2)缓存:性能很高可用于持久化缓存层。
(3)大尺寸低价值的数据:替代一些文件存储。
(4)高伸缩性的场景:集群分布计算支持。
(5)用于对象和JSON数据的存储:BSON格式非常适合文档化格式的数据存储及查询。
2.常见应用场景
(1)存储日志:在物联网或者运维监控场景下,存储较为复杂的设备快照或者日志数据,可以做成相关监控报表。
(2)存储状态变更信息:在电商或者物流场景下,以内嵌数组的形式记录订单信息、状态信息,一次性就可以把订单的所有变更查询出来。
(3)存储实时更新数据:在游戏和直播场景下,以内嵌文档的形式存储用户信息、点赞礼物等,方便更新查询。
三、可能遇到的问题
1.MongoDB是否支持事务?
MongoDB只支持行级事务,或者说只保证单行操作的原子性。
2.MongoDB大数据迁移怎么做?
一般来说mongodump来迁移即可。集群迁移的话,可以直接在目标服务器上搭建从节点,全部搭建完之后把从节点升级为主节点,再把老机器剔除去集群。
3.MongoDB的水平扩展是什么原理?
MongoDB的水平扩展之后主要依赖于有config组件负责管理数据元位置,mongo的路由会从config获取数据所在或者应该所在的节点位置,从而去对应的数据节点读取(路由本身也会缓存)。
4.MongoDB出现负载过高的情况如何处理?
可能的情况有连接数突然变高,查询突然变多,查询没有索引,大表索引等。
简单点看db.currentop或者看mongotop和mongostat,currentop是看当前正在执行的是什么任务,数量有多少,也可以去showlog里面看是否有记录,然后mogotop和mongostat是用了查看和平时比有什么异常。