MongoDB-聚合、索引、备份

聚合操作
  • 聚合操作介绍
    • 聚合(aggregate)
      • 基于数据处理和聚合管道,由多个阶段的管道(stage)组成
      • 每个阶段的管道具有分组、过滤等功能
      • 处理文档的时候,每个管道会对其进行以一些的分组,过滤等,最终输出结果 
    • 聚合工作视图
  • 管道的使用
    • 管道的表达式
      • 表达式
        • db.集合名称.aggregate({管道名:{表达式}})
    • 常用管道
      • $group: 将集合中的⽂档分组, 可⽤于统计结果
      • $match: 过滤数据, 只输出符合条件的⽂档
      • $project: 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果
      • $sort: 将输⼊⽂档排序后输出
      • $limit: 限制聚合管道返回的⽂档数
      • $skip: 跳过指定数量的⽂档, 并返回余下的⽂档
      • $unwind: 将数组类型的字段进⾏拆分
    • 常⽤表达式(只能配合$group管道使用):
      • 语法:表达式:  '$列名'
      • $sum:   计算总和,     $sum:1 表示以⼀倍计数
      • $avg:    计算平均值
      • $min:    获取最⼩值
      • $max:   获取最⼤值
      • $first:   根据资源⽂档的排序获取第⼀个⽂档数据
      • $last:    根据资源⽂档的排序获取最后⼀个⽂档数据
      • $push:  将结果⽂档中插⼊值到⼀个数组中
      • $push  表达式的效果
      • $push: '$$ROOT'  的效果
    • 聚合管道使用方法
      • $match   过滤
        • 示例:
      • $group   分组
        • 示例:
          • _id :用来确定分组字段,表示靠哪个字段进行分组,后面接 $字段名(null为统计全部(_id固定,不能改名称)
            • 当依据多个字段进行分组的时候要将,多个字段以{显示字段:1 $分组字段1, 显示字段2, $分组字段2}
              • 示例:
            • 如果字段的值为字典,并且想以值的一个字段来分组 表达式写成  $文档字段.字段值的字段
              • 示例:
          • 下面的显示字段: 表达式计算的结果显示字段(可随意更改名称)
      • $project     修改输入文档结构,按照$project 定义的格式进行输出
        • 示例:
        • 重命名字段:   $project:{新字段名:"$原字段名"}
        • 将字段显示或者去除:  字段值为1表示显示,字段值为0表示隐藏
        • _id 字段默认的值为1,如果想隐藏,需要将其值改为0
      • $sort     将文档进行排序
        • 示例:
        • 字段值为-1表示按照字段降序排序,1为表示按照字段升序排序
      • $limit与$skip    获取固定数量与跳过指定数量的文档
        • 示例:
        • $limit     只获取指定数量的文档
        • $skip    跳过指定数量文档
        • 注意:在使用的时候,要先写skip , 后写limit
      • $unwind       将包含数组数值的文档,拆分成多条
        • 语法:
          • 普通写法:
            • db.collection_name.aggregate({$unwind:'$字段名称'})    
              • $unwind 后边接$字段名称就可以,不需要接字典类型的数据
              • 这种情况,当数组中没有内容的时候,将不会被$unwind输出,会造成数据丢失
          • 防止数据丢失写法
            • db.collection_name.aggregate({$unwind:{ path: ''$字段名称'', preserveNullAndEmptyArrays:true  }})
              • 如果数组的内容为空的数据,将会被$unwind去掉对应的字段    
              • preserve  的值默认为false不会进行数据防丢失
        • 示例1:
          • db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})
          • db.t2.aggregate({$unwind:'$size'})
          • 结果如下:
          • { "_id" : 1, "item" : "t-shirt", "size" : "S" }
          • { "_id" : 1, "item" : "t-shirt", "size" : "M" }
          • { "_id" : 1, "item" : "t-shirt", "size" : "L" }
        • 示例2:
创建索引
  • 创建普通索引的方法
    • db.collection_name.ensureindex({"字段名":1})
      • 1表示升序, 会提升升序sort操作的效率
      • -1表示降序,会提升降序sort操作的效率
  • 创建唯一索引的方法
    • db.t1.ensureindex({"字段名":1,{"unique": true,"dropDups": true}})
      • "unique": true 表示创建的索引是唯一索引,默认值为false
      • "dropDups": true  表示消除重复,会删除,索引字段值重复的文档,默认值为false
      • 创建唯一索引后,不能向集合中添加重复的数据
  • 创建联合索引
    • db.t1.ensureindex({"字段1":1, "字段2":1})
      • 当需要联合查询才能确定到确定文档的时候,可以建立联合索引
  • 查看当前集合的所有索引
    • db.t1.getindexes()
  • 删除索引
    • db.t1.dropindex("索引字段名称")
  • 创建索引后的影响
    • 提升了数据库的查询find\sort速度(要根据创建索引的字段进行查询 )
    • 当创建唯一索引后,便不能向集合中添加相同的索引字段的数据
  • 备注:
    • 显示执行mongodb语句的时间:在表达式的后边加上.explain('executionStats')
数据库的备份和恢复(在终端中操作)
  • 备份数据库的语法
    • mongodump -h dbhost -d dbname -o dbdirectory
      • -h:  服务器地址, 也可以指定端⼝号(默认表示本机的默认ip地址和端口号)
      • -d: 需要备份的数据库目录名称
      • -o: 备份的数据存放位置, 此⽬录中存放着备份出来的数据
    • 备注
      • 备份后都是.json和.bson的文件
  • 数据库恢复的语法:
    • mongorestore -h dbhost -d dbname --dir dbdirectory
      • -h: 服务器地址加端口号(默认为本机默认端口)
      • -d: 需要恢复的数据库实例名称
      • --dir: 备份数据所在位置


刘小恺(Kyle) wechat
如有疑问可联系博主