一、Mongo的简介
- 文档型数据NoSQL, 海量文档存储
- JSON存储格式,没有严格的表结构(灵活)
二、Mongo 和SQL的比较
三、Mongo的语法
四、Mongo的增删改查
- 创建collection db.createCollection(“abc”)
- 删除collection db.abc.drop()
- 插入document db.abc.insert({‘key’:’value’})
- 更新document ( 字段及其内容)
- 更新字段: 第一个参数表示筛选的范围,第二个参数表示更新的内容,第三个表示所有的全部修改(没有则只修改第一个)db.abc.update({‘title’:’mongo123’},{$set:{‘title’:’mongo’}},{multi:true})
- 添加字段: 第一个参数表示筛选的范围,第二个参数表示新增的key-value,第三个表示所有的全部修改(没有则只添加第一个)db.abc.update({‘title’:’mongo123’},{$set:{‘titleNew’:’mongoNew’}},{multi:true})
- 删除字段: 第一个参数表示筛选的范围,第二个参数表示删除的key-value, 第三个表示所有的全部修改(没有则只修改第一个)db.abc.update({‘title’:’mongo123’},{$unset:{‘title’:’mongo’}},{multi:true})
- 删除document
- db.abc.remove({}) 删除所有 删除所有的文档
- db.abc.remove({‘title’:’mongo教程’}) 删除所有相关的document
- 查找document
- db.abc.find({}) 查找所有
- db. Abc.find({‘title’:’mongo教程’}) 查找相关的
五、Mongo的操作符
- 条件操作符 lt,lte
- 更新操作符 unset[删除],push
- 类型操作符 $type
六、Mongo的索引(假设col 为collection)
- 索引的类型
- u _id 索引,默认
- 单键索引 db.col.createIndex({‘score’:’1’})
- 复合索引 db.col.createIndex({‘userId’:1,”score”:1})
- 多值索引(针对数组)db.col.createIndex({‘tags’:1}), tags为数组,索引会对数组的单个值建立索引
- 嵌套文档建立索引 db.col.createIndex({‘address.city’:1})
- 全文索引 db.col.createIndex({‘content’:’text’})
- 索引的原理
- B树的树内存储数据,因此查询单条数据时候,B树的查询效率不固定,最好的情况是O(1)。我们可以认为在做单一数据查询的时候,使用B树平均性能更好。但是由于B树中各节点之间没有指针相邻,因此B树不适合做一些数据便历操作
- B+树的数据只出现在叶子节点上,因为查询单挑数据的时候,查询速度非常稳定。因此,在做单一数据查询的时候,平均性能并不如B树。但是B+树的叶子节点上有指针进行相连,因此在做数据遍历的时候,只需要对叶子节点进行遍历即可,这个特性使得B+树非常适合做范围查询。
- Mongo使用B树,可能是因为Mysql中遍历查询比较多,所有用B+树做索引结构。而Mongodb只是做单一查询比较多,数据遍历操作比较少,索引用B树为索引结构。
七、Mongo的聚合查询
- 聚合管道: db.col. aggregate([{},{},{}]),通过管道语法进行层次筛选
- 统计求和sum:1 db.class.aggregate({group:{_id:’sex’,num:{sum:1}}) 统计男女总人数
- 统计求值group:{_id:’sex’,num:{sum:$age}}}) 统计男女总年龄
- 平均值avg: db.class.aggregate({group:{_id:’sex’,avg:{age’}}})
- 最大/小值max/min: db.class.aggregate({group:{_id:’sex’,max:{age’}}})
- 指定集合的域project: db.class.aggregate({project:{_id:0,name:1,age:1}})
- 数据筛选 match: db.class.aggregate({match:{age:{$gt:20}}})
八、Mongo的join操作
- 左连接,通过lookup模拟 `db.orders.aggregate([
{
$lookup:
{
From:’inventory’, // 另外一个collection
localField:’item’, // 源集合中的match值,例如user_id
foreignField: ‘sku’, // 待join的集合中的match值,例如cus_id
As: ‘inventory _docs’ // 新的field 名字
}
}
])`
参考:www.cnblogs.com/mh20131118/…
九、Mongo的数据结构,锁,事务和集群架构
Mongo和SQL 的对照
十、Mongo的锁 (单文档)
- 之前是全局锁,数据库锁,现在可以到collection锁
- 读锁,写锁,意向读锁,意向写锁
- 场景
十一、Mongo的多文档事务
- 4.0 之前的处理方法
- 通过子文档嵌套
- 通过二阶段协议来实现分布式,可能和
- 4.0 之后的处理方法
- mongo在4.0提供了对复制集的事务支持,完全意义上的事务,计划在4.2提供对分片事务的支持。
参考:www.zybuluo.com/JunQiu/note…
十二、Mongo的架构
-
主从复制:其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。主要是防止数据丢失问题,但是不能解决主节点发生故障的问题。
-
副本集:主从集群和副本集最大的区别就是副本集没有固定的主节点,整个集群会选出一个主节点。主要解决的是主节点发生故障所导致的数据丢失或不可用的问题。
- 分片集:所谓分片就是将数据拆分并分散存储在不同机器上的过程。主要解决的是海量数据的可用性问题。
参考
1. www.cnblogs.com/kaleidoscop…