MongoDB【MongoDB索引Index (索引概述、索引类型、复合索引、)】(三)-全面详解(学习总结---从入门到深化)

 

 

目录

MongoDB索引Index 


聚合操作

通过聚合操作可以处理多个文档,并返回计算后的结果。

  • 对多个文档进行分组
  • 对分组的文档执行操作并返回单个结果
  • 分析数据变化

 聚合管道

分别由多个阶段来处理文档,每个阶段的输出是下个阶段的输入, 返回的是一组文档的处理结果,例如,total、average、 maxmium、minimium。

 插入下列数据,供聚合操作用

db.orders.insertMany( [
   { _id: 0, name: "Pepperoni", size: "small",price: 19,
     quantity: 10, date: ISODate( "2030-03-13T08:14:30Z" ) },
   { _id: 1, name: "Pepperoni", size: "medium",price: 20,
     quantity: 20, date : ISODate( "2030-03-13T09:13:24Z" ) },
   { _id: 2, name: "Pepperoni", size: "large",price: 21,
     quantity: 30, date : ISODate( "2030-03-17T09:22:12Z" ) },
   { _id: 3, name: "Cheese", size: "small",price: 12,
     quantity: 15, date : ISODate( "2030-03-13T11:21:39.736Z" ) },{ _id: 4, name: "Cheese",
size: "medium", price: 13,
    quantity:50, date : ISODate( "2031-01-12T21:23:13.331Z" ) }, { _id: 5, name:"Cheese", size: "large", price: 14,
     quantity: 10, date : ISODate( "2031-01-12T05:08:13Z" ) },
   { _id: 6, name: "Vegan", size: "small",price: 17,
     quantity: 10, date : ISODate( "2030-01-13T05:08:13Z" ) },
   { _id: 7, name: "Vegan", size: "medium",price: 18,
     quantity: 10, date : ISODate( "2030-01-13T05:10:13Z" ) }
] )

计算尺寸为medium的订单中,每种类型的订单数量

db.orders.aggregate( [
   // Stage 1: 匹配size:"medium"的文档
   {
      $match: { size: "medium" }
   },
   // Stage 2: 根据name统计过滤后的文档,并把"quantity"值相加
   {
      $group: { _id: "$name", totalQuantity: {$sum: "$quantity" } }
   }
] )

输出结果:

[
   { _id: 'Cheese', totalQuantity: 50 },
   { _id: 'Vegan', totalQuantity: 10 },
   { _id: 'Pepperoni', totalQuantity: 20 }
]

更复杂的例子:

db.orders.aggregate( [
   // Stage 1: 根据日期范围过滤
   {
      $match:
     {
         "date": { $gte: new ISODate( "2030-01-01" ), $lt: new ISODate( "2030-01-30" ) }
     }
   },
   // Stage 2: 对过滤后文档以日期为条件进行分组并计算
   {
      $group:
     {
         _id: { $dateToString: { format: "%Y-%m-%d", date: "$date" } },
         totalOrderValue: { $sum: { $multiply:[ "$price", "$quantity" ] } },
         averageOrderQuantity: { $avg:"$quantity" }
     }
   },
   // Stage 3: 按照订单价值倒序排列文档
   {
      $sort: { totalOrderValue: -1 }
   }
 ] )

计算结果:

{ "_id" : "2030-01-13", "totalOrderValue" : 350, "averageOrderQuantity" : 10 }

统计集合中文档数量

db.collection.count()

根据指定的字段进行过滤,去掉重复的文档

db.collection.distinct()

聚合管道顺序优化

聚合管道在执行的过程中有一个优化的阶段,以提高性能。

$addFields: {
    maxTime: { $max: "$times" },
    minTime: { $min: "$times" }
} },
{ $project: {
    _id: 1, name: 1, times: 1, maxTime: 1,minTime: 1,
    avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: {
    name: "Joe Schmoe",
    maxTime: { $lt: 20 },
    minTime: { $gt: 5 },
    avgTime: { $gt: 7 }
} }

优化思路:优化器把$match阶段分成了4个独立的过滤器,尽可能 把过滤器放在$project操作前面,优化后的聚合管道如下:

{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
    maxTime: { $max: "$times" },
    minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
    _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
    avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }

再例如:

{ $sort: { age : -1 } },
{ $match: { status: 'A' } }

优化后:

{ $match: { status: 'A' } },
{ $sort: { age : -1 } }

限制事项

  • 返回结果集不能超过16M字节
  • 单个管道中的stage数量不能超过1000个(MongoDB 5.0)

实时效果反馈

1.下列聚合操作命令中有错的是哪个? 

A $sum、$avg、$unset

B $min 、$push、$first

C $last、$group、$project

D $match、$limit、$max

MongoDB索引Index 

索引概述

索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指 向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当 于图书的目录,可以根据目录中的页码快速找到所需的内容。索引目标是提高数据库的查询效率,没有索引的话,查询会进行全表扫描(scan every document in a collection),数据量大时严重降低 了查询效率。默认情况下Mongo在一个集(collection)创建时, 自动地对集合的_id创建了唯一索引。 

 索引类型

单键索引

MongoDB默认所有的集合在_id字段上有一个索引。 下图是一个在score字段上建立的升序/降序索引示意图。

创建一个名为records的集合,并插入下面的数据

{
  "_id": ObjectId("180c06a4ad577233f97tf825"),
  "score": 356,
  "location": { province: "Hebei", city: "Tangshan" }
}

 创建索引,1代表升序,-1代表降序

db.records.createIndex( { score: 1 } )

在内嵌字段上建立索引

db.records.createIndex( { "location.province": 1 } )

在内嵌文档上建立索引

db.records.createIndex( { location: 1 } )

复合索引

复合索引是指单个索引结构指向多个字段,下图展示了在两个字段 上建立索引

使用下面的数据来创建一个复合索引

{
"item": "Banana",
"category": ["food", "produce", "grocery"],
"location": "4th Street Store",
"stock": 4,
"type": "cases"
}

 在item和stock字段上建立升序索引

db.products.createIndex( { "item": 1, "stock": 1 } )

复习:

文件上传_SpringBoot基于FastDFS实现

 引入Thymeleaf视图解析器

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency> 
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

下载wangEditor富文本编辑器

为何选择 wangEditor

简洁、轻量级、文档齐全

万星项目 Github Star 1w+

npm 周下载量 1w+

CDN 月下载量百万+(来自 jsdelivr)

QQ 群及时答疑

开源团队维护,非个人单兵作战

 

 编写index页面

<!DOCTYPE html>
<html lang="en"
xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>wangEditor demo</title>
</head>
<body>
<div id="div1">
    <p>欢迎使用 <b>wangEditor</b> 富文本编辑器
</p>
</div>
<script type="text/javascript" th:src="@{wangEditor.min.js}"
src="../static/wangEditor.min.js"></script>
<script type="text/javascript">
    const E = window.wangEditor
    const editor = new E('#div1')
    //设置文件上传的参数名称
    editor.config.uploadFileName = 'files'
    // 配置 server 接口地址
    editor.config.uploadImgServer = '/upload/uploadMoreImage.do'
    // 2M
    editor.config.uploadImgMaxSize = 2 *1024 * 1024
    editor.config.uploadImgAccept = ['jpg','jpeg', 'png', 'gif', 'bmp', 'webp']
    // 一次最多上传 5 个图片
    editor.config.uploadImgMaxLength = 5
    editor.create()
</script>
</body>
</html>

编写Controller接口

@RestController
@RequestMapping("/upload")
public class UoloadToFastDFSController {
    //fastdfs存储节点的客户端对象
    @Autowired
    private FastFileStorageClient fastFileStorageClient;
    @GetMapping("/upload")
    public void uploadMoreImage(MultipartFile[] files){
        //判断是否上传图片
        if(files != null && files.length != 0 ){
            //遍历上传图片
            for (MultipartFile multipartFile : files) {
                //获取上传文件名
                String filename = multipartFile.getOriginalFilename();
                //获取最后一个“.”的下标,并获取从这个下标的下一个下标开始后的字符作为文件后缀
                String fileSuffix = filename.substring(filename.lastIndexOf(".")+ 1);
                StorePath storePath = null;
                try {
                    //上传文件
                    storePath = fastFileStorageClient.uploadFile(multipartFile.getInputStream(),multipartFile.getSize(), fileSuffix, null);
               } catch (IOException e) {
                    e.printStackTrace();
               }
                //打印返回的文件在存储节点的唯一标识
          System.out.println(storePath.getFullPath());
          }
       }
   }
}

FastDFS集成Nginx

 Nginx服务器是一个高性能的web服务器与反向代理服务器。

FastDFS集成Nginx的2个原因

1 为分布式文件系统提供Http服务支持

通过Nginx的web服务代理访问分布式文件系统的存储节点,从而实 现通过http请求访问存储节点资源。

注意: src 属性值图像文件的 URL。也就是引用该图像的文件的的绝对路径或相对路径。 

 1 解决复制延迟问题

由于FastDFS的同卷的存储节点之间需要同步,当文件尚未同步完成时,访问请求到达改节点,获取的数据将是未同步完的不完整数 据,即为复制延迟问题。通过Nginx检测请求的存储节点的数据, 若该存储节点的数据尚未同步完成,则将请求转发至数据的原存储节点,从而解决复制延迟问题。

实时学习反馈

1.FastDFS集成Nginx主要目的正确的是____。

A 为分布式文件系统提供Http服务支持

B 解决复制延迟问题

C 以上都是正确 

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

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

相关文章

GitLab名词介绍

GitLab名词介绍 分支&#xff1a;active、stale、default、protected IDEA中git面板&#xff1a;本地、远程、HEAD 合并时的选项&#xff1a;Delete、squash 查看Git常用操作 分支&#xff1a;active、stale、default、protected 在分支页面下&#xff0c;有active、stale…

Acwing 849. Dijkstra求最短路 I

Acwing 849. Dijkstra求最短路 I 链接:849. Dijkstra求最短路 I - AcWing题库 /*题解:dijkstra算法模板对于单源最短路径dijkstra1.每次找到当前距离源最近的节点 作为确定距离的点2.通过这个点看能否让其他的节点来松弛其他点到源的距离重复12操作*/ #include<algorithm&g…

端口映射的作用?如何在路由器上做端口映射

一、端口映射作用 路由器中设置端口映射的主要作用&#xff0c;就是让Internet上的其他用户&#xff0c;可以访问你路由器下面电脑中的数据(软件、文件)。 当家里的电脑使用路由器上网后&#xff0c;在Internet下的其它电脑、手机等网络设备&#xff0c;将无法自接访问你电脑…

linux常用的命令

一.操作目录命令 1.1 ls 命令 语法&#xff1a; ls [选项] [目录或文件] 功能: 对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; a 列出目录下的所有文件&#xff0c;包括以 . 开头的隐含…

仙境传说RO:添加自定义道具

仙境传说RO&#xff1a;添加自定义道具 大家好&#xff0c;我是艾西今天和大家聊一下仙境传说RO怎么添加自定义道具。在我们开服时加入一些道具模组等往往会让我们的服务器更有特色以及消费点&#xff0c;那么让我们直接进入正题开始操作&#xff1a;&#xff08;此处我们讲的…

【C#】Kestrel和IIS服务器下的同步与异步配置

最近在回看自己写的代码时&#xff0c;发现服务配置里最开头写了两段代码&#xff0c;第一感觉&#xff0c;这是啥功能&#xff0c;太久有点生疏了&#xff0c;经过一顿搜索和回顾&#xff0c;简单整理如下 目录 1、Kestrel服务器1.1、跨平台1.2、高性能1.3、可扩展性1.4、安全…

零矩阵

暴力解法&#xff1a;先全部检索&#xff0c;定位0所在的位置&#xff0c; 记录到新的数组 数组的行列分别进行去重 数组中记录的行列赋值为零 如果直接修改&#xff0c;在行被修改之后&#xff0c;修改列时会因为行已经被修改产生影响 import org.junit.Test;import java.uti…

二十三种设计模式第十四篇--策略模式

策略模式&#xff1a;主要围绕一个类的行为或者其算法在运行时更改&#xff0c;也是一种行为型模式。 在软件开发中&#xff0c;我们经常遇到需要根据不同的情况选择不同算法或行为的情况。传统的做法是使用大量的条件语句来实现这种逻辑&#xff0c;但这样的实现方式往往难以…

Python模拟MQTT v3.1.1服务器

示例代码 import logging import asyncio from hbmqtt.broker import Broker# 设置日志级别为DEBUG logging.basicConfig(levellogging.DEBUG)# 创建MQTT服务器 broker Broker()# 启动MQTT服务器 async def start_broker():await broker.start()# 停止MQTT服务器 async def s…

python离线安装ibm_db

下载离线包ibm_db以及clidriver 下载imb_db 在pypi官方网站https://pypi.org/project/ibm-db/#files下载离线安装包ibm_db-3.0.2.tar.gz。下载clidriver 下载地址&#xff1a;https://public.dhe.ibm.com/ibmdl/export/pub/software/data/db2/drivers/odbc_cli/nt32_odbc_cli.…

C语言学生信息管理系统

C语言版学生信息管理系统 一&#xff0c;开发环境 操作系统&#xff1a;windows10, windows11, linux, mac等。开发工具&#xff1a;Qt, vscode, visual studio等开发语言&#xff1a;c语言 二&#xff0c;功能需求 1. 用户界面: 提供一个简洁的文本界面&#xff0c;用户可…

AI 对抗超级细菌:麦克马斯特大学利用深度学习发现新型抗生素 abaucin

内容一览&#xff1a;鲍曼不动杆菌是一种常见的医院获得性革兰氏阴性病原体&#xff0c;通常表现出多重耐药性。利用传统方法&#xff0c;发现抑制此菌的新型抗生素很困难。但利用机器学习可以快速探索化学空间&#xff0c;从而增加发现新型抗菌分子的可能性。近期&#xff0c;…

AI大数据智能视频融合平台EasyCVR新增Ehome黑白名单配置

EasyCVR视频融合平台基于云边端智能协同架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台支持海量视频汇聚管理&#xff0c;可支持多协议接入&#xff0c;包括市场主流标准协议与厂家私有协议及SDK&#xff0c;如&#xff1a;国标GB28181、RTMP、RTSP/Onvi…

2023-07-12:RocketMQ如何做到消息不丢失?

2023-07-12&#xff1a;RocketMQ如何做到消息不丢失&#xff1f; 答案2023-07-12&#xff1a; RocketMQ通过刷盘机制、消息拉取机制和ACK机制等多种方式来确保消息投递的可靠性&#xff0c;防止消息丢失。 1.刷盘机制 RocketMQ中的消息分为内存消息和磁盘消息&#xff0c;内…

【Linux】基础开发工具——gcc/g++篇

文章目录 一、预处理1.1 头文件展开1.2 条件编译 二、编译三、汇编四、链接4.1 什么是库?4.2 库的分类4.3 目标文件和库是如何链接的&#xff1f;4.3.1 动态链接4.3.2 静态链接 4.4 动静态链接的优缺点对比 五、Debug&&release 前言 &#xff1a;  在前面的文章里给大…

1、计算机网络核心

序号地址1计算机网络核心2数据库相关3Redis4Linux相关5JVM的内容6GC相关的7Java多线程与并发8Java多线程与并发-原理9Java常用类库与技巧10Java框架-Spring 文章目录 1、OSI开放式互联参考模型2、TCP/IP3、TCP报文头4、TCP的三次握手5、TCP的四次挥手6、为什么会有TIME_WAIT状态…

ARM Coresight 系列文章 7 - ARM Coresight 通过 AHB-AP 访问 cpu 内部 coresight 组件

文章目录 如下图所示&#xff0c;如果A78想去访问M33的内部 coresight 组件 ETM&#xff0c;需要要怎么做&#xff1f; 答案也正是在图中&#xff0c;首先A78 通过AXI 互联&#xff0c;接入到 APBIC 的 slave port&#xff0c;再通过APBIC 的 master 送出&#xff0c;而APBIC中…

机器学习-进化算法

进化算法 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;crossovermutation 进化策略&#xff08;Evolutionary Strategies&#xff0c;ES&#xff09;基因编程&#xff08;Genetic Programming&#xff09;Multi-objective Evolutionary Algorithms 遗传算…

在Linux中传输文件文件夹的10个scp命令

scp 命令的基本语法 下面的命令将读作 copy source_file_name进入destination_folder在destination_host使用username account。 > scp source_file_name usernamedestination_host:destination_folder里面有很多参数scp你可以使用的命令。以下是可能在日常使用中使用的参数…

跟着Promise的节奏,让你的代码脱颖而出

文章目录 Promise简介Promise实例方法1. then(onFulfilled, onRejected)2. catch(onRejected)3. finally(onFinally)4. Promise.resolve(value)5. Promise.reject(reason)6. Promise.all(iterable)7. Promise.race(iterable) Promise实例方法1. prototype.then(onFulfilled, on…