由C++语言编写,MongoDB是一个基于分布式文件存储的开源数据库系统,为了解决大量数据并发和搜索的问题。高负载下,添加更多节点,保证服务器性能
是一个介于关系数据库和非关系数据库之间的产品,
将数据存储为一个文档,数据结构由键值(key=>value)对组成,类似于json对象,字段值可以包含文档,数组,以及文档数组
可用Girdfs什么东西存储小文件,但是不能超过4M,mongodb的文件格式可以存储二进制文件
MongoDB不是纯粹的内存数据库,只是对数据的操作大部分都在内存种,所有数据都是存在再硬盘上的,所有操作的数据通过mmap的方式映射到内存某个区域中
磁盘占用空间比较大,空间换时间,成熟度没有mysql 那么稳定成熟,比较年轻
基本概念
数据库MongoDB的单个实例可以容纳多个独立的数据库,
集合,数据库是由集合组成的,一个集合用来表示一个实体,比如学生集合
文档,集合由文档组成的,一个文档表示一条记录,比如一条学生信息
ObjectId
MongoDB采用一个称之为Objectld的类型的来做主键,Objectld是一个12字节的BSON类型字符串,(BSON:binary JSON),按照字节顺序,依次代表
前四个字节:UNIX时间戳
1字节:表示运行的MongiDB的机器,MAC地址
2字节:表示生成此_id 的进程
3字节:由一个随机数开始的计数器生成的值
该_id,自行添加写入的不用人为操作,不过也可以在添加时手动写入,如果重复会报错(重复键错误)
使用场景
json格式存储,最接近真实对象模型,对开发友好,方便快速迭代,
高可用复制集,满足数据可靠,服务高可用的需求,运维简单,故障自动切换,可扩展分片集合,强大的索引能力,地理位置索引可用于构建各种o2o应用,文本检索解决搜索的需求
目前只支持单文档事务,复杂场景暂时不适合,
mmapv1wiredtiger,mongordck,in-memory等多种引擎支持满足各场景需求
案例
游戏场景:使用MongoDB存储游戏用户信息,用户装备,积分等直接以内嵌文档形式存储,方便存储更新
物流场景:存储订单信息,订单状态再运送过程中会不断更新,以内嵌数组的形式,来存储,一次查询就能将订单的变更读取出来
社交场景:存储用户信息,以及用户发表的朋友圈信息,通过地理位置搜索时间附近的人,地点
视频直播,用户信息,礼物信息
是否使用MongDB,下面会有几个选项确定一下,符合一个就可以考虑MongDB,2个及以上,选择MongDB就绝对不会后悔
应用不需要事务以及复杂join支持
新应用,需求汇编,数据模型无法确定,想快速迭代
应用需要2000-3000以上的读写QPS或者更高
应用需要TB甚至PB级别数据存储
应用要求存储不丢失
应用需要99.999%高可用
应用需要大量的地理位置查询,文本查询
优势
快速,拥有适量级内存的MongDB的性能是非常迅速的,他将热数据存储在物理内存中(而不仅仅是索引和少部分数据)使得热数据的读写变得十分快捷,从而提高整体的速度与效率
高扩展性,Mongdb的高可用与集群架构拥有十分高的扩展性,通过物理机器的增加,以及sherding的增加,Mongdb的扩展将达到一个十分惊人的地步
自身的Failover机制,Mongodb的副本集配置中,当主库遇到问题,无法继续提供服务的时候,副本集将选举出一个新的主库来继续提供服务
json的存储格式,Mongodb的json和Bson存储格式十分适合文档格式的存储和查询
劣势