MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示)

目录

一、MongoDB 索引

1.1、说明

1.2、原理

1.3、操作

1.3.1、创建索引

1.3.2、查看集合索引列表

1.3.3、查看集合索引大小

1.3.4、删除集合所有索引

1.3.5、删除集合指定索引

1.3.6、创建复合索引

1.4、聚合

a) 统计每个作者写的文章数

b)统计每个作者各自文章中点赞量的最大值

c)统计每个作者各自文章中点赞量的最小值

d) 统计每个作者的平均点赞量

e)统计每个作者的所有文章内容(不会去重)

f)统计每个作者的所有文章内容(去重)

g) 获取每个作者第一个文章标题.

h)获取每个作者最后一个文章标题.


一、MongoDB 索引


1.1、说明

MongoDB 中的索引和 MySQL 索引十分类似,能够极大的提高查询效率,如果没有索引,就需要扫描全集数据,效率非常低.  索引是一种特殊的数据结构,存储在一个易于遍历的读取的数据集合中,是对数据库表中一列或多列值进行排序的一种结构.

1.2、原理

下图来自于 MongoDB 官方文档:Indexes — MongoDB Manual

解释:

例如有一个 users 集合,每一个元素都含有 score 这个属性,现在如果需要查询分数小于 30 的文档,在没有索引的情况下就需要扫描全集数据,将符合条件的放到结果集中.

为了提升查询效率,我们就可以对 score 建立索引,建立索引的过程中就会对成绩按照我们建立索引的指定的参数,对分数进行升序或者降序排序,保存到索引库中.  这样,当查询分数小于 30 的文档时,就可以直接从排好序的分数索引中拿到分数对应的指针,进而拿到文档.

1.3、操作

1.3.1、创建索引

语法如下

db.集合名.createindex(keys, options)

 示例如下

> db.index.find();
{ "_id" : 0, "name" : "cyk0", "age" : 20 }
{ "_id" : 1, "name" : "cyk1", "age" : 21 }
{ "_id" : 2, "name" : "cyk2", "age" : 22 }
{ "_id" : 3, "name" : "cyk3", "age" : 23 }
{ "_id" : 4, "name" : "cyk4", "age" : 24 }
{ "_id" : 5, "name" : "cyk5", "age" : 25 }
{ "_id" : 6, "name" : "cyk6", "age" : 26 }
{ "_id" : 7, "name" : "cyk7", "age" : 27 }
{ "_id" : 8, "name" : "cyk8", "age" : 28 }
{ "_id" : 9, "name" : "cyk9", "age" : 29 }
> 
> db.index.createindex({name: 1, age: -1})
{
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"createdCollectionAutomatically" : false,
	"ok" : 1
}

语法中的 key 表示要创建的索引对象,1 表示按照升序创建索引,-1 表示降序创建索引.

options 表示一些可选参数,如下(黄色标记为常用参数):

Parameter

Type

Description

background

Boolean

建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。

有时候创建的索引特别大,就可能会阻塞,因此需要后台创建.

unique

Boolean

建立的索引是否唯一。指定为true创建唯一索引。默认值为false.

name

string

索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。

sparse

Boolean

对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.

expireAfterSeconds

integer

指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。

v

index version

索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。

weights

document

索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。

default_language

string

对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语

language_override

string

对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.

例如指定索引的名称:

> db.index.createIndex({age: 1}, {name: 'age_index'});
{
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"createdCollectionAutomatically" : false,
	"ok" : 1
}
> 
> db.index.getIndexes();
[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"age" : 1
		},
		"name" : "age_index"
	}
]
> 

1.3.2、查看集合索引列表

db.集合名.getIndexes()

1.3.3、查看集合索引大小

db.集合名.totalIndexSize()

 

 

1.3.4、删除集合所有索引

db.集合名.dropIndexes()

Ps:id 索引不会被删除.

1.3.5、删除集合指定索引

db.index.dropInde('索引名')

1.3.6、创建复合索引

与 MySQL 的复合索引一样,一个索引值是由多个 key 进行维护的索引就是复合索引.

db.集合名.createIndex({key, key, ......})

1.4、聚合

MongoDB 中的聚合主要用于处理 例如 求和、求差、平均值 等,并返回计算结果. 类似于 MySQL 中的 max()、count(*).

db.集合名.aggregate([{$group: {_id: '$要分组的字段', 自定义组名: {聚合表达式}}}])
表达式描述实例
$sum计算总和。db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avg计算平均值db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$min获取集合中所有文档对应值得最小值。db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max获取集合中所有文档对应值得最大值。db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$push将值加入一个数组中,不会判断是否有重复的值。db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet将值加入一个数组中,会判断是否有重复的值,若相同的值在数组中已经存在了,则不加入。db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first根据资源文档的排序获取第一个文档数据。db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last根据资源文档的排序获取最后一个文档数据db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

例如数据如下:

作者 cyk 写了文章 aaa 和 bbb,作者 lyj 写了文章 ccc.  likes 表示点赞量.

a) 统计每个作者写的文章数

当然有需要,也可以对聚合的结果乘上一个倍数.

b)统计每个作者各自文章中点赞量的最大值

c)统计每个作者各自文章中点赞量的最小值

d) 统计每个作者的平均点赞量

e)统计每个作者的所有文章内容(不会去重)

f)统计每个作者的所有文章内容(去重)

g) 获取每个作者第一个文章标题.

 

h)获取每个作者最后一个文章标题.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/320610.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

没有自动化测试项目经验,3个项目帮你走入软测职场!

学习自动化测试最难的是没有合适的项目练习。测试本身既要讲究科学,又有艺术成分,单单学几个 API 的调用很难应付工作中具体的问题。 你得知道什么场景下需要添加显性等待,什么时候元素定位需要写得更加优雅,为什么需要断言这个元…

如何用MetaGPT帮你写一个贪吃蛇的小游戏项目

如何用MetaGPT帮你写一个贪吃蛇的小游戏项目 MetaGPT是基于大型语言模型(LLMs)的多智能体写作框架,目前在Github开源,其Start数量也是比较高的,是一款非常不错的开源框架。 下面将带你进入MetaGPT的大门,开启MetaGPT的体验之旅。…

机器人行业概况(2)

上篇已经介绍过关于机器人的定义以及分类,下面来看看机器人产业市场规模。 二、国内机器人产业市场规模 中国机器人产业在国家智能制造相关政策的引导下蓬勃发展。在新冠肺炎疫情防控期间,消毒、配送、测温、巡检等各类机器人的“火线上岗”&#xff0…

Electron中 主进程(Main Process)与 渲染进程 (Renderer Process) 通信的方式

1. 渲染进程向主进程通信 修改 html 文件内容 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><!-- 解决控制…

C# 基础入门

第二章 C# 语法基础 2-1 C# 中的关键字 关键字&#xff0c;是一些被C#规定了用途的重要单词。 在Visual Studio的开发环境中&#xff0c;关键字被标识为蓝色&#xff0c;下图代码中&#xff0c;用红方框圈出的单词就是关键字。 关键字 class &#xff0c;这个关键字的用途是…

【GitHub项目推荐--谷歌大神又一开源代码调试神器】【转载】

如果调试是 Debug 的必经之路&#xff0c;那么编程应该将它考虑在内。今天我就和大家分享一个代码调试神器 - Cyberbrain。 Cyberbrain是一个免费开源的 Python 代码调试解决方案&#xff0c;它可视化程序执行以及每个变量的变化方式&#xff0c;让程序员免受调试之苦。主要具有…

【Docker】centos中及自定义镜像,并且上传阿里云仓库可提供使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是平顶山大师&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《【Docker】centos中及自定义镜像&#xff0c;…

零零鸡生态养殖农场“出圈”,有“智”更有“质”,助力本土品牌高质量发展

什么是生态农场&#xff1f;不同于常规农场&#xff0c;它对农业生产经营单元的各个关键环节有着极为严格的要求&#xff0c;强调整体、协调、循环、再生、多样&#xff0c;产品质量自然更好&#xff0c;附加值也更高&#xff0c;更能满足日趋多样化的巨大市场。零零鸡生态农场…

机器学习---xgboost算法

1. xgboost算法原理 XGBoost&#xff08;Extreme Gradient Boosting&#xff09;全名叫极端梯度提升树&#xff0c;XGBoost是集成学习方法的王 牌&#xff0c;在Kaggle数据挖掘比赛中&#xff0c;大部分获胜者用了XGBoost。 XGBoost在绝大多数的回归和分类 问题上表现的十分…

蓝桥杯准备

书籍获取&#xff1a;Z-Library – 世界上最大的电子图书馆。自由访问知识和文化。 (zlibrary-east.se) 书评&#xff1a;(豆瓣) (douban.com) 一、观千曲而后晓声 别人常说蓝桥杯拿奖很简单&#xff0c;但是拿奖是一回事&#xff0c;拿什么奖又是一回事。况且&#xff0c;如果…

用通俗易懂的方式讲解:图解 Transformer 架构

文章目录 用通俗易懂方式讲解系列1.导语2.正文开始现在我们开始“编码”从宏观视角看自注意力机制从微观视角看自注意力机制通过矩阵运算实现自注意力机制残差模块最终的线性变换和Softmax层训练部分总结损失函数再进一步 用通俗易懂方式讲解系列 用通俗易懂的方式讲解&#x…

开源6位半万用表硬件电路分析

开源6位半手持式万用表 这里用的LM399H参考源&#xff0c;单片机是STM32L152&#xff0c;里面还用了MACHXO2-1200FPGA。 万用表由两块PCB组成。 硬件组成部分 电源管理电路 电源用的是6-10V&#xff0c;电源管理部分&#xff0c;首先用来一个ADP5070芯片&#xff08;内部含有…

NumPy:从初识到实战,探索Python科学计算的无限可能

NumPy 在浩瀚的Python编程世界中&#xff0c;有一个强大的库如星辰般璀璨&#xff0c;它是数据科学家、机器学习工程师乃至量化金融分析师手中的利器——NumPy&#xff0c;它以其高效的数据处理能力和便捷的矩阵运算机制&#xff0c;在科研与工程领域中占据着举足轻重的地位。…

【msvcr120.dll】修复电脑出现msvcr120.dll找不到的详细方法

“msvcr120.dll丢失”。那么&#xff0c;msvcr120.dll丢失是什么意思呢&#xff1f;msvcr120.dll丢失的原因是什么&#xff1f;msvcr120.dll的作用又是什么呢&#xff1f;当msvcr120.dll丢失时&#xff0c;会对计算机产生什么影响&#xff1f;本文将详细介绍这些问题&#xff0…

寻找最富裕的小家庭 - 华为OD统一考试

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 在一棵树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为一个小家庭现给你一棵树,请计算出最富裕的小家庭的财富和。 输入描述 第一行为一个数N,…

spring cloud feign demo

1. 工程结构 2. 父工程pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…

墙地砖外形检测的技术方案-图像获取

硬件系统 墙地砖外形检测硬件系统主要由工业相机、光源、瓷砖位置检测电路和上位机组成&#xff0c;其结构如图所示。为了提高系统检测精度和稳定性&#xff0c;系统采用的是较高精度的高速工业相机用于抓取墙地砖表面轮廓图像&#xff0c;图像数据通过USB接口向上位机传送&am…

ElasticSearch(1):Elastic Stack简介

1 简介 ELK是一个免费开源的日志分析架构技术栈总称&#xff0c;官网https://www.elastic.co/cn。包含三大基础组件&#xff0c;分别是Elasticsearch、Logstash、Kibana。但实际上ELK不仅仅适用于日志分析&#xff0c;它还可以支持其它任何数据搜索、分析和收集的场景&#xf…

使用Qt连接scrcpy-server控制手机

Qt连接scrcpy-server 测试环境如何启动scrcpy-server1. 连接设备2. 推送scrcpy-server到手机上3. 建立Adb隧道连接4. 启动服务5. 关闭服务 使用QTcpServer与scrcpy-server建立连接建立连接并视频推流完整流程1. 开启视频推流过程2. 关闭视频推流过程 视频流的解码1. 数据包协议…

bash shell基础命令

1.shell启动 shell提供了对Linux系统的交互式访问&#xff0c;通常在用户登录终端时启动。系统启动的shell程序取决于用户账户的配置。 /etc/passwd/文件包含了所有用户的基本信息配置&#xff0c; $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash ...例如上述root账户信…