MongoDB基础入门:从概念到核心特性 一、MongoDB概述MongoDB来自英文单词Humongous中文含义为庞大是可以应用于各种规模的企业、各个行业以及各类应用程序的开源数据库。MongoDB是目前NoSQL数据库中使用最广泛的数据库之一是一个用C语言编写的开源文档数据库。1.1 核心特点MongoDB的主要特性包括面向集合存储易于存储对象类型的数据模式自由无需预先定义数据结构支持动态查询灵活的查询方式支持完全索引提升查询效率支持复制和故障恢复高可用性保障高效的二进制数据存储文件存储格式为BSON一种JSON的扩展高性能读写根据官方性能测试MongoDB 3.0在多线程、批量插入场景下的处理速度比2.6版本快7倍1.2 高可用架构MongoDB的Replication副本集提供自动故障转移和数据冗余服务采用副本集的集群中具有三种角色角色职责主节点Master负责数据的读写操作从节点Slaver负责数据同步和读写分离仲裁节点Arbiter负责心跳监控Master宕机时可将Slaver切换为Master这种架构保证了数据库中的全部数据都有多份备份实现了数据的高可用需求。二、核心概念2.1 文档Document在MongoDB中文档是处理信息的基本单位。多个键及其关联的值有序地放置在一起便是文档采用BSONBinary JSON格式存储。文档的特点键值对有序{sport:football,address:北京}与{address:北京,sport:football}是不同的文档值区分类型字符串18和数字18是不同的值键区分大小写name和Name是不同的键示例文档{country:China,city:BeiJing}文档之间的关系包括嵌入和引用两种。2.2 存储结构层次MongoDB的存储结构分为四个层次数据库Database └── 集合Collection └── 文档Document └── 键值对Key-Value2.3 集合Collection集合是一组文档构成的对象没有固定的结构可以插入不同格式和类型的数据。但通常情况下一个集合中的文档应具有一定的关联性。2.4 键的命名规则使用UTF-8格式字符串不能包含\0空字符习惯上不使用.和$以_开头的多为保留键自定义时一般不以_开头键不能重复在一条文档里起唯一作用三、BSON数据类型BSON是Binary JSON的简称是MongoDB使用的二进制存储格式支持比JSON更丰富的数据类型类型描述示例NULL空值或不存在的字段{x:null}Boolean布尔型{x:true}Number数值默认64位浮点{x:3.14}NumberInt4字节符号整数{x:NumberInt(3)}NumberLong8字节符号整数{x:NumberLong(3)}StringUTF-8字符串{x:中文}Regular Expression正则表达式{x:/[cba]/}Array数组{x:[a,b,c]}Object内嵌文档{a:{b:3}}ObjectId12字节唯一标识{x:ObjectId()}Binary Data二进制数据用于存储非UTF-8字符Date日期{x:new Date()}Timestamp时间戳var a new Timestamp()JavaScriptJavaScript代码{x:function(){/*...*/}}四、数据库管理4.1 命名规则不能是空串不得含有/、\、?、$、空格、空字符等区分大小写建议全部小写名称最多64字节不得使用保留名admin、local、config4.2 系统保留数据库库名作用admin权限数据库用户自动继承所有权限local数据永远不会被复制config分片时保存分片信息test默认测试数据库五、索引机制5.1 索引简介索引基于B-tree数据结构可以提升文档查询速度。MongoDB在_id字段上默认创建主键索引。5.2 索引类型索引类型说明创建语法单键索引单个字段索引db.collection.createIndex({key:1})复合索引多个字段组合索引db.collection.createIndex({key1:1,key2:-1})多键值索引数组字段索引db.collection.createIndex({key:1})地理索引2dsphere/2d地理坐标索引—全文索引字符串内容搜索db.collection.createIndex({key:text})散列索引字段散列值索引db.collection.createIndex({_id:hashed})注意单键索引的排序方向升序1/降序-1对单字段查询无关紧要MongoDB可在任意方向遍历索引。六、聚合操作聚合操作将来自多个文档的值组合在一起按条件分组后进行计算返回单个结果。MongoDB提供三种聚合方法6.1 聚合管道Aggregation Pipeline将文档输入处理管道在管道内完成过滤、分组、排序等操作最终转换为聚合结果。db.orders.aggregate([{$match:{status:A}},{$group:{_id:$cust_id,total:{$sum:$amount}}}])等价于MySQLSELECTcust_idAS_id,SUM(amount)AStotalFROMordersWHEREstatusLIKE%A%GROUPBYcust_id;6.2 Map-Reducedb.collection.mapReduce(function(){emit(key,value);},function(key,values){returnreduceFunction;},{query:document,out:collection})七、总结MongoDB作为最流行的NoSQL文档数据库具有以下核心优势灵活的文档模型无需预定义模式字段可动态增减高性能基于BSON二进制存储读写效率高高可用副本集自动故障转移易扩展支持水平扩展分片丰富的查询能力支持动态查询、索引、聚合等多种操作理解MongoDB的文档模型、存储结构和索引机制是掌握这款数据库的关键基础。