1. 简介
mongodb是用C++语言编写的一个基于分布式文件存储的数据库。他是介于关系数据库和非关系数据库之间的产品,它可以储存类似json的bson格式数据,因此可以储存比复杂的数据类型,Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引
2. 特性
mongodb的设计目标是高性能、可扩展、易部署、易使用,存储数据非常方便。其主要功能特性如下。
- 面向集合存储,容易存储对象类型的数据。在mongodb中数据被分组存储在集合中,集合类似RDBMS中的表,一个集合中可以存储无限多的文档。
- 模式自由,采用无模式结构存储。在mongodb中集合中存储的数据是无模式的文档,采用无模式存储数据是集合区别于RDBMS中的表的一个重要特征。
- 支持完全索引,可以在任意属性上建立索引,包含内部对象。mongodb的索引和RDBMS的索引基本一样,可以在指定属性、内部对象上创建索引以提高查询的速度。除此之外,mongodb还提供创建基于地理空间的索引的能力。
- 支持查询。mongodb支持丰富的查询操作,mongodb几乎支持SQL中的大部分查询。
- 强大的聚合工具。mongodb除了提供丰富的查询功能外,还提供强大的聚合工具,如count、group等,支持使用MapReduce完成复杂的聚合任务。
- 支持复制和数据恢复。mongodb支持主从复制机制,可以实现数据备份、故障恢复、读扩展等功能。而基于副本集的复制机制提供了自动故障恢复的功能,确保了集群数据不会丢失。
- 使用高效的二进制数据存储,包括大型对象(如视频)。使用二进制格式存储,可以保存任何类型的数据对象。
- 自动处理分片,以支持云计算层次的扩展。mongodb支持集群自动切分数据,对数据进行分片可以使集群存储更多的数据,实现更大的负载,也能保证存储的负载均衡。
- 支持Perl、PHP、Java、C#、JavaScript、Ruby、C和C++语言的驱动程序,mongodb提供了当前所有主流开发语言的数据库驱动包,开发人员使用任何一种主流开发语言都可以轻松编程,实现访问mongodb数据库。
- 文件存储格式为BSON(JSON的一种扩展)。BSON是对二进制格式的JSON的简称,BSON支持文档和数组的嵌套。
- 可以通过网络访问。可以通过网络远程访问mongodb数据库。
3. 与关系型数据库的对比
| 对比项 | mongodb | mysql |
|---|---|---|
| 数据库模型 | 关系型 | 非关系型 |
| 表 | collection | table |
| 表的一行数据 | document | record |
| 表字段 | key | field |
| 字段值 | value | value |
| 主外键 | mongodb自动将_id字段设置为主键 | PK,FK |
| 索引 | 支持 | 支持 |
| 支持事务 | 仅单文档支持事务操作 | 支持 |
| join | 不支持 | 支持 |
| 内存占用 | 大 | 小 |
| 数据处理方式 | 将热点数据储存在内存中,提高查询效率 | 不同引擎有不同处理方式 |
4. 数据类型
| 数据类型 | 描述 | 描述 |
|---|---|---|
| null | 表示空值或未定义的对象 | {“x”:null} |
| 布尔值 | 真或假:true或false | {“x”:true} |
| 32位整数 | 32位整数。shell是不支持该类型的,shell中默认会转换成64位浮点数 | |
| 64位整数 | 64位整数。shell是不支持该类型的,shell中默认会转换成64位浮点数 | |
| 64位浮点数 | 64位浮点数。shell中的数字就是这一种类型 | {“x”:3.14,“y”:3} |
| 字符串 | UTF-8字符串 | {“foo”:“bar”} |
| 符号 | shell不支持,shell会将数据库中的符号类型的数据自动转换成字符串 | |
| 对象id | 文档的12字节的唯一id | {“id”:ObjectId()} |
| 日期 | 从标准纪元开始的毫秒数 | {“date”:newDate()} |
| 正则表达式 | 文档中可以包含正则表达式,遵循JavaScript的语法 | {“foo”:/foobar/i} |
| 代码 | 文档中可以包含JavaScript代码 | {“x”:function(){}} |
| 未定义 | undefined | {“x”:undefined} |
| 数组 | 值的集合或者列表 | {“arr”:[“a”,“b”]} |
| 内嵌文档 | 文档可以作为文档中某个key的value | {“x”:{“foo”:“bar”}} |
5. 应用场景
• 游戏场景,使用 mongodb 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新
• 物流场景,使用 mongodb 存储订单信息,订单状态在运送过程中会不断更新,以 mongodb 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
• 社交场景,使用 mongodb 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能
• 物联网场景,使用 mongodb 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析
• 视频直播,使用 mongodb 存储用户信息、礼物信息等
• ……