Mongo基础

158 阅读3分钟

一、Mongo的简介

  • 文档型数据NoSQL, 海量文档存储
  • JSON存储格式,没有严格的表结构(灵活)

二、Mongo 和SQL的比较

图片1.png

三、Mongo的语法

图片2.png

四、Mongo的增删改查

  • 创建collection   db.createCollection(“abc”)
  • 删除collection   db.abc.drop()
  • 插入document   db.abc.insert({‘key’:’value’})
  • 更新document ( 字段及其内容)
  1. 更新字段: 第一个参数表示筛选的范围,第二个参数表示更新的内容,第三个表示所有的全部修改(没有则只修改第一个)db.abc.update({‘title’:’mongo123’},{$set:{‘title’:’mongo’}},{multi:true})
  2. 添加字段: 第一个参数表示筛选的范围,第二个参数表示新增的key-value,第三个表示所有的全部修改(没有则只添加第一个)db.abc.update({‘title’:’mongo123’},{$set:{‘titleNew’:’mongoNew’}},{multi:true})
  3. 删除字段: 第一个参数表示筛选的范围,第二个参数表示删除的key-value, 第三个表示所有的全部修改(没有则只修改第一个)db.abc.update({‘title’:’mongo123’},{$unset:{‘title’:’mongo’}},{multi:true})
  • 删除document
  1. db.abc.remove({}) 删除所有 删除所有的文档
  2. db.abc.remove({‘title’:’mongo教程’}) 删除所有相关的document
  • 查找document
  1. db.abc.find({}) 查找所有
  2. db. Abc.find({‘title’:’mongo教程’}) 查找相关的

五、Mongo的操作符

  • 条件操作符 gt,gt, lt,gte,gte, lte
  • 更新操作符 set[设置]set[设置],unset[删除],rename,rename,push
  • 类型操作符 $type

六、Mongo的索引(假设col 为collection)

  • 索引的类型
  1. u _id 索引,默认
  2. 单键索引  db.col.createIndex({‘score’:’1’})
  3. 复合索引  db.col.createIndex({‘userId’:1,”score”:1})
  4. 多值索引(针对数组)db.col.createIndex({‘tags’:1}), tags为数组,索引会对数组的单个值建立索引
  5. 嵌套文档建立索引 db.col.createIndex({‘address.city’:1})
  6. 全文索引 db.col.createIndex({‘content’:’text’})
  • 索引的原理
  1. B树的树内存储数据,因此查询单条数据时候,B树的查询效率不固定,最好的情况是O(1)。我们可以认为在做单一数据查询的时候,使用B树平均性能更好。但是由于B树中各节点之间没有指针相邻,因此B树不适合做一些数据便历操作
  2. B+树的数据只出现在叶子节点上,因为查询单挑数据的时候,查询速度非常稳定。因此,在做单一数据查询的时候,平均性能并不如B树。但是B+树的叶子节点上有指针进行相连,因此在做数据遍历的时候,只需要对叶子节点进行遍历即可,这个特性使得B+树非常适合做范围查询。
  3. Mongo使用B树,可能是因为Mysql中遍历查询比较多,所有用B+树做索引结构。而Mongodb只是做单一查询比较多,数据遍历操作比较少,索引用B树为索引结构。

七、Mongo的聚合查询

  • 聚合管道: db.col. aggregate([{},{},{}]),通过管道语法进行层次筛选
  • 统计求和sum:1  db.class.aggregate({group:{_id:’sex’,num:{sum:1}}) 统计男女总人数
  • 统计求值sum[key]:db.class.aggregate(sum:[key]: db.class.aggregate(group:{_id:’sex’,num:{sum:$age}}}) 统计男女总年龄
  • 平均值avg: db.class.aggregate({group:{_id:’sex’,avg:{avg:avg:’age’}}})
  • 最大/小值max/min: db.class.aggregate({group:{_id:’sex’,max:{max: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 的对照

图片3.png

图片4.png

图片5.png

十、Mongo的锁 (单文档)

  • 之前是全局锁,数据库锁,现在可以到collection锁
  • 读锁,写锁,意向读锁,意向写锁
  • 场景

图片6.png

十一、Mongo的多文档事务

- 4.0 之前的处理方法

  1. 通过子文档嵌套
  2. 通过二阶段协议来实现分布式,可能和
  • 4.0 之后的处理方法
  1. mongo在4.0提供了对复制集的事务支持,完全意义上的事务,计划在4.2提供对分片事务的支持。

参考:www.zybuluo.com/JunQiu/note…

 

十二、Mongo的架构

  • 主从复制:其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。主要是防止数据丢失问题,但是不能解决主节点发生故障的问题。 图片7.png

  • 副本集:主从集群和副本集最大的区别就是副本集没有固定的主节点,整个集群会选出一个主节点。主要解决的是主节点发生故障所导致的数据丢失或不可用的问题。

图片8.png

  • 分片集:所谓分片就是将数据拆分并分散存储在不同机器上的过程。主要解决的是海量数据的可用性问题。

图片9.png

图片10.png

参考

1. www.cnblogs.com/kaleidoscop…

2. www.jianshu.com/p/d838a5905…

3. blog.csdn.net/baidu_36095…

4. blog.csdn.net/qq_59138417…

5. piaosanlang.gitbooks.io/mongodb/con…