mongodb基础操作之聚合操作、索引优化

mongodb基础操作之聚合操作、索引优化


更好的阅读体验 https://www.wolai.com/wrMtYWKdkzKYjoWM1i64qu


目录

聚合操作

聚合管道操作

$group 将集合中的文档进行分组,便于后续统计结果


$limit 用于限制MongoDB聚合管道返回的文档数


$match 用于过滤数据,只输出符合条件的文档


$sort 将输入的文档先进行排序,再输出


$project 用于修改输入文档的结构(增加,删除字段等)和名称


$skip 在聚合管道中跳过指定数量的文档,并返回剩余的文档


具体语法:

# $group
db.COLLECTION_NAME.aggregate([{$group:{<key1>:"$<key2>"}}]).pretty()

# $limit
db.COLLECTION_NAME.aggregate({$limit:整型数字}).pretty()

# $match
db.COLLECTION_NAME.aggregate([{$match:{<key>:<value>}}]).pretty()

# $sort, -1表示降序, 1表示升序
db.COLLECTION_NAME.aggregate([{$sort:{<key>:-1 or 1}}]).pretty()

# $project
db.COLLECTION_NAME.aggregate([{$project:{<key>:<value>}}]).pretty()

# $skip
db.COLLECTION_NAME.aggregate({$skip:整型数字}).pretty()

group: 将集合中的文档按userid进行分组

db.firstCollection.aggregate([{$group:{"_id": "$userid"}}]).pretty()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xOzMu1nz-1654414283983)(image/image_r0sE7bJ0xd.png)]

limit:指定集合只展示两个文档

db.firstCollection.aggregate({$limit:2}).pretty()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rCo96aVa-1654414283984)(image/image_UNzxZXRVDa.png)]

match: 将集合中的nickname为爱德华的文档查询出来

db.firstCollection.aggregate([{$match:{"nickname":"爱德华"}}]).pretty()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yXiS6Ogh-1654414283985)(image/image_uNqDTLARAW.png)]

sort:将集合中的文档按照age进行降序排序

db.firstCollection.aggregate([{$sort:{"age":-1}}]).pretty()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s9qqpvDc-1654414283985)(image/image_NibFuoUuUz.png)]

project: 展示集合中的文档,并且文档均不包含字段_id,articleid,content

 db.firstCollection.aggregate([{$project:{ "_id":0, "articleid":0, "content":0}}]).pretty()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-38uF2dpE-1654414283986)(image/image_h8qIgx1VBk.png)]

skip:跳过集合中_id为5之前的文档(不包含5),只展示_id为5之后的文档

db.firstCollection.aggregate({$skip:5}).pretty()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lo8dbf5G-1654414283986)(image/image_wiS_H6Zlji.png)]


常见管道表达式及相关说明

$sum 计算总和


$avg 计算平均值

db.COLLECTION_NAME


$min 获取集合中所有文档对应值的最小值


$max 获取集合中所有文档对应值的最大值


$push 在结果文档中插入值到一个数组中


$first 获取分组文档中的第一个文档


$last 获取分组文档中的最后一个文档

Map-Reduce操作

MongoDB提供Map-Reduce来进行聚合操作。

db.firstCollection.mapReduce( 
  function() {emit(this.nickname, 1);}, 
  function(key,values) {return Array.sum(values)}, 
  { 
    query:{state:"1"}, out:"comment_total" 
  } 
)

输出结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Ztywsa6-1654414283986)(image/image_OV4qxjjBxd.png)]

result:存储结果集

timeMillis:执行Map-Reduce操作所花时间

input:满足筛选条件被输入到map函数的文档次数

emit:在map函数中emit()方法被调用的次数,也就是集合中满足条件的文档数量

output:结果集合中的文档个数

ok:判断执行Map-Reduce操作是否成功,若执行成功则显示1,反之用err表示

使用索引优化查询

MongoDB的索引可以分为6种:单字段索引、复合索引、多键索引、地理空间索引、文本索引和哈希索引

默认的情况下,MongoDB中所有集合在_id字段上都有一个索引。由于MongoDB可以从任何方向遍历索引,因此对于单个字段索引和排序操作来说,索引项的排序顺序并不重要。

若文档的字段为数组类型,则每个字段都是数组中的一个元素,MongoDB将会为数组中的每个元素创建索引,因此被称为多键索引。

索引操作

查看索引

db.COLLECTION_NAME.getIndexes()

查询集合firstCollection中的索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YNhERXma-1654414283987)(image/image_MeZYME4RV9.png)]

返回的结果中有4个字段,分别是v、key、name以及ns,其中字段v表示索引引擎的版本号,字段key表示添加索引的字段,默认是_id,其值为1表示索引是升序方式排序;字段namne表示索引的名称,也就是字段加上_,即_id_;字段ns表示索引存储的命名空间,即数据库test的集合firstCollection中。

查看索引大小

db.COLLECTION_NAME.totalIndexSize()

查询集合firstCollection中的索引大小

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gUghtxIU-1654414283987)(image/image_5Ey6xuIt8-.png)]

创建索引

db.COLLECTION_NAME.createIndex(keys,options)

  • keys:该参数的数据类型为文档类型,是包含字段和值的文档,其中字段是索引键,值为描述该字段的索引类型。若指定字段为升序索引,则指定值为1,反之,则指定值为-1

  • options:该参数的数据类型为文档类型,其为可选项,包含一组控制索引创建的选项的文档。常见的选项有unique和name,其中选项unique描述建立的索引是否唯一,若值为true,则创建唯一索引,默认值为false;选项name描述所创建索引的名称,若是未指定名称,MongoDB则会通过连接索引的字段名和排序顺序生成一个索引名称

在集合firstCollection中创建单字段索引,即在userid的字段上创建索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8IVZOejw-1654414283988)(image/image_gaPyPoR1m3.png)]

查看索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vSc25naP-1654414283988)(image/image_GiAPW5xDnA.png)]

创建复合索引,即在userid和nickname的字段上同时创建索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z2QminVK-1654414283988)(image/image_2kQzv0rkOJ.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WLKuYimQ-1654414283989)(image/image_2n_CHtl03S.png)]

删除索引

#删除单个索引

db.COLLECTION_NAME.dropIndex(index)

#删除所有索引

db.COLLECTION_NAME.dropIndexes()

删除userid索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uogGGSXJ-1654414283989)(image/image_Jl5Rj-3Y0d.png)]

删除所有索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XQdQdSC6-1654414283989)(image/image_Q-v1W_K65K.png)]

📌索引_id_是默认的,无法进行删除,只能删除非字段_id 的索引


更好的阅读体验 https://www.wolai.com/wrMtYWKdkzKYjoWM1i64qu


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值