MongDB特性总结

简介

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)。每组结果传给给客户端之前调用一次。

你可能感兴趣的:(MongDB特性总结)