mongodb进阶
文章目录
mongodb入门 https://blog.csdn.net/qq_40846669/article/details/120070800
1. aggregate(聚合)
-
聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
- 管道的概念和linux系统中的管道类似,把上一步的输出作为下一步的输入
-
命令
-
db.集合名.aggregate({管道:{表达式}})
-
常用管道命令
命令 含义 $group 将集合中的⽂档分组, 可⽤于统计结果 $project 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果 $match 过滤数据, 只输出符合条件的⽂档 $sort 将输⼊⽂档排序后输出 $limit 限制聚合管道返回的⽂档数 $skip 跳过指定数量的⽂档, 并返回余下的⽂档 $unwind 将数组类型的字段进⾏拆分 -
常用表达式命令
命令 含义 $sum 计算总和, $sum:1 表示每条数据当作“1”计数 $avg 计算平均值 $min 获取最⼩值 $max 获取最⼤值 $push 在结果⽂档中插⼊值到⼀个数组中 $first 根据资源⽂档的排序获取第⼀个⽂档数据 $last 根据资源⽂档的排序获取最后⼀个⽂档数据
-
-
1.1 $group
-
$group注意点和使用规则
- 分组依据需要放到_id后面
- 取值时需要使用在前面加**$**符号
- $group中有几个建结果就有几个键
-
举例
- 数据
-
db.test10.aggregate({$group:{_id:"$age"}})
,将上面的数据以年龄分组(如果_id:null则统计整个文档) -
db.test10.aggregate({$group:{_id:"$age", count:{$sum:1}}})
,将上面的数据以年龄分组,并输出计数count
1.2 $project
- 修改文档的输出结构
- 举例
- 如下只输出name且将name改为mingzi
- _id:0,表示id不输出
- 多个管道之间可以连用,
- 举例,
- ①将数据以名字分类且统计数量,②用mingzi作为名字的键,shuliang作为数量的键,不显示id
db.test10.aggregate({$group:{_id:"$name", count:{$sum:1}}}, {$project:{mingzi:"$_id", shuliang:"$count", _id:0}})
1.3 $match
- $match和find有类似之处都可以使用逻辑符号、表达式等
- 但是$match是管道,可以将结果交给下一个管道,find则不行
- 举例,统计年龄大于20的zhangsan个数
db.test10.aggregate({$match:{age:{$gt:20}}},{$group:{_id:"$name", count:{$sum:1}}})
1.4 $sort
-
$sort与sort()方法也有类似之处
- 同样
字段名:1
为升序字段名:-1
位降序 db.test10.aggregate({$sort:{age:1}})
按名字升序排列
- 同样
1.5 $limit和$skip
- $limit、$skip和limit()、skip()方法也差不多
- 两者同样不分顺序,不过推荐先试用$skip再使用$limit
db.test10.aggregate({$skip:1},{$limit:1})
先跳过一个再查询一个。
1.6 $unwind
- $unwind 将数组类型的字段进⾏拆分
- 如下$unwind拆分字段的时候,只会拆分有这个字段的文档数据,没有的不显示。如果需要显示则需要添加一个参数
preserveNullAndEmptyArrays
db.test10.aggregate({$unwind:"$friend"})
db.test10.aggregate({$unwind:{path:"$friend", preserveNullAndEmptyArrays:true}})
- 如下$unwind拆分字段的时候,只会拆分有这个字段的文档数据,没有的不显示。如果需要显示则需要添加一个参数
2. 索引
-
索引用于大数量查询的时候提升查询速度
-
创建索引
db.集合名.ensureIndex({字段名:1})
- 1表示升序,-1表示降序。一般没有影响,但是在使用sort排序时会产生影响
- 默认情况下会以id自动创建索引,但是查询的时候并不一定都以id来查询,所以可以根据查询的需要手动创建索引
- 可以通过
db.集合名.find().explain('executionStats')
结果中的executionTimeMillisEstimate字段查看查询所用的时间
-
查看当前集合所有索引
db.集合名.getIndexes()
-
删除索引
db.集合名.dropIndex('索引名':1)
,根据实际情况输入1或者-1
3. 数据的备份和恢复
- 备份语法
mongodump -d 数据库名 -o 备份的数据存放位置
- 恢复语法
mongorestore -d 恢复后的数据库名 --dir 备份数据的存放位置