简介
MongoDB是一个面向文档的非关系型数据库,强大、灵活、易于扩展。关系型数据库如MySQL需要预先定义模式(predefined schema),但是MongoDB没有固定的模式,取决于用户。当然没有哪个用户糊涂到在同一个集合中存储不同模式的文档,否则给查询造成不必要的麻烦。
易于扩展
MongoDB的设计采用横向扩展,能自动处理跨集群的数据和负载,自动重新分配文档,以及将用户请求路由到正确的机器上。
特性
- 支持索引,而且所有实现非常类似于MySQL,提供唯一索引(对于不重复数据来说很有优势,但是对于null值只能存在一个)、稀疏索引(忽略null的唯一索引,非常有用的特性)、复合索引(即联合索引)、覆盖索引、地理空间索引(支持GeoJSON格式存储地理位置、计算地理间距、查询最近的距离等)、TTL索引(具有生命周期的索引,MongoDB每分钟对TTL索引清理一次,这是相当不不错的特性)、全文索引(如果想在文档中搜索文本的话,你肯定用得着,当然很有可能此时你必须考虑是否该使用搜索引擎了)。
- GridFS大文件存储。GridFS是MongoDB专门用来存储大型二进制文件的,它是一个独立的存储系统,类似于Hbase。GridFS自动故障转移、平衡副本等,文件存储的集中度比较高,MongoDB是以2G为单位分配数据文件的。缺点也是有的,性能比较低,比直接使用文件系统还差。文档修改只能删除后重建。GridFS适合不经常修改的大文件存储。当然这个适合可以考虑其他如Hbase之类的。
- 聚合。聚合可以说是MongoDB非常耀眼的功能。它可以完成很多复杂的统计功能。相比一些NoSQL,如Redis。这方面强大太多(有点类似于ElasticSearch的强大的聚集功能,可惜是ElasticSearch是近实时的,这是硬伤)。下面重点谈谈强大聚合功能:
聚合
筛选(filtering)
$match操作符用于对集合进行筛选,过滤掉不需要的查询,当然这一步你可以直借使用条件查询过滤。当然两者配合最好了。
投射(project)
$project操作符更加强大。你可以进行:
1. 字段提取(只需要部分字段就满足需求了)。
2. 字段重命名(SQL中AS)、数学表达式($add、$substract、$multiply、$divide、$mod等)、日期表达式(提取日期:$year、$month、$week、$dayOfMonth、$dayOfWeek、$dayOfYear、$hour、$minute、$second等)。
3. 字符串操作(子串、拼接、大小写转换等)。
4. 逻辑表达式。
分组
1. 分组group(SQL中的group by)。分组就是归类的意思了。就是按类别来统计数据,这个太常用了。分组求和、分组求均值、分组求极值(最大、最小)
2. 数组操作($addToSet(不可重复)、$push(可重复))。
3. 分拆数组($unwind分拆数组的每个值成为单独的文档)。
排序
排序$sort
分页
分页($skip、$limit,但是$skip性能不咋地,使用游标进行懒加载比较好)
其他
1. MapReduce可以完成更复杂的任务,因为它可以直接执行javascript脚本,不过性能必然不咋地,离线处理数据还行。
2. 完成器(finalize)。每组结果传给给客户端之前调用一次。