聚合操作
- 聚合操作介绍
- 聚合(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: 备份数据所在位置