mongodb进阶

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中有几个建结果就有几个键
  • 举例

    • 数据image-20210902232307549
  • db.test10.aggregate({$group:{_id:"$age"}}),将上面的数据以年龄分组(如果_id:null则统计整个文档)

  • db.test10.aggregate({$group:{_id:"$age", count:{$sum:1}}}),将上面的数据以年龄分组,并输出计数count

    • image-20210902233023711

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}})
      • image-20210903141513103
    • image-20210903141020214

1.3 $match

  • $match和find有类似之处都可以使用逻辑符号、表达式等
    • 但是$match是管道,可以将结果交给下一个管道,find则不行
    • 举例,统计年龄大于20的zhangsan个数
    • db.test10.aggregate({$match:{age:{$gt:20}}},{$group:{_id:"$name", count:{$sum:1}}})
    • image-20210903142532343

1.4 $sort

  • $sort与sort()方法也有类似之处

    • 同样字段名:1为升序字段名:-1位降序
    • db.test10.aggregate({$sort:{age:1}})按名字升序排列

    image-20210903145346309

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}})
    • image-20210903155000536

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 备份数据的存放位置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇者lin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值