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

news2024/10/7 10:24:01

 

 

目录

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 以上都是正确 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C / C++的wprintf打印速度太慢,改WriteConsoleW输出提速200+倍

在 C / C 处理将UTF-8字符串内容输出到终端控制台时&#xff0c;平时惯用一个广泛使用的 wprintf() 函数&#xff0c;虽然它支持 Unicode 、UTF-8 字符&#xff0c;但在测试过程中发现它输出大文件时会有严重拖累性能&#xff0c; 测试打印文件&#xff1a;一个将近6万行的 Jav…

VTK 学习笔记一

https://www.cnblogs.com/yangai/p/5955614.html VTK笔记-了解VTK_黑山老妖的笔记本的博客-CSDN博客 一、VTK一般流程 1、source 数据源 VTK基础教程&#xff08;1&#xff09;- vtkPolyData 介绍_TGTSTTG的博客-CSDN博客 vtkSource 数据源&#xff0c;个人理解的就是故事灵…

从交易成本模型的角度解析高频交易策略的优劣

高频交易作为一种快速的股市交易方式&#xff0c;越来越受到了投资者的关注。但是&#xff0c;高频交易捕捉到的价格差很小&#xff0c;因此需要使用的交易成本模型与传统的投资方式有所不同。本文将从交易成本模型的角度出发&#xff0c;探讨高频交易策略的优劣。 一、交易成…

jar-protect Jar 包加壳工具

jar-protect 是 java 的 jar 加密加壳工具&#xff0c;对 class 文件进行加密防护&#xff0c;避免反编译破解。 java 本身是开放性极强的语言&#xff0c;代码也容易被反编译&#xff0c;没有语言层面的一些常规保护机制&#xff0c;jar 包很容易被反编译和破解。 受 classfi…

【资料分享】RK3568核心板规格书(4x ARM Cortex-A55(64bit),主频1.8GHz)

1 核心板简介 创龙科技SOM-TL3568是一款基于瑞芯微RK3568J/RK3568B2处理器设计的四核ARM Cortex-A55全国产工业核心板&#xff0c;每核主频高达1.8GHz/2.0GHz。核心板CPU、ROM、RAM、电源、晶振、连接器等所有器件均采用国产工业级方案&#xff0c;国产化率100%。 核心板通过…

Android中的SDK以及利用Android Studio生成aar

1、什么是SDK&#xff08;Software Development Kit&#xff09; 广义上的SDK&#xff1a; 指的是为特定的软件包、软件框架、硬件平台、操作系统等建立应用程序时所使用的开发工具的集合。比如你在编辑器里敲代码的时候它会自动补全代码&#xff0c;自动错误检查&#xff0c…

Linux开发工具Make/Makefile篇

文章目录 &#x1f348;0. 前言&#x1f349;1. 见见猪跑&#x1f34a;2. 依赖关系和依赖方法&#x1f34b;3. 清理&#x1f34c;4. 不可多次编译的原理&#x1f34d;4.1 原因&#x1f34d;4.2 stat命令&#x1f34d;4.3 验证 &#x1f96d;5. 伪目标&#x1f34e;6. 取消回显 …

【如何用大语言模型快速深度学习系列】从word2vec、SVD到GloVe

三天热度果然名不虚传&#xff0c;写作的效率有所下降&#xff0c;但是只要坚持二十一天就能养成习惯啦&#xff01;冲冲冲&#xff01; 上一节回顾 文章链接 在上一章我们将词的概念&#xff0c;通过n-gram组合成了n个词的切片&#xff0c;终于将前后词之间建立了一个联系&a…

MySQL授权操作

目录 授权和撤销授权 创建用户 授权 撤销授权 授权其他用户与撤销权限 授权和撤销授权 创建用户 create user 用户名% identified by 密码; 示例&#xff1a;create user tom% identified by 123456; 授权 GRANT ALL ON 库名.表名 TO 用户名’客户端主机 ; 示例&a…

【动手学习深度学习--逐行代码解析合集】08模型选择、欠拟合和过拟合

【动手学习深度学习】逐行代码解析合集 08模型选择、欠拟合和过拟合 视频链接&#xff1a;动手学习深度学习–模型选择、欠拟合和过拟合 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 1、生成数据集 import math import numpy a…

ROS:参数名称设置

目录 一、前言二、rosrun设置参数三、launch文件设置参数四、编码设置参数4.1C实现4.1.1ros::param设置参数4.1.2ros::NodeHandle设置参数 4.2python实现 一、前言 在ROS中节点名称话题名称可能出现重名的情况&#xff0c;参数名称也可能重名。 关于参数重名的处理&#xff0c…

Css:浮动相关

1.为什么需要浮动&#xff1f; 多个块级元素纵向排列找 标准流&#xff0c;多个块级元素横线排列找 浮动 2.浮动的特性 浮动会脱离标准流&#xff08;脱标&#xff09; 浮动的盒子不再保留原来的位置 3.清除浮动

BM68-矩阵的最小路径和

题目 给定一个 n * m 的矩阵 a&#xff0c;从左上角开始每次只能向右或者向下走&#xff0c;最后到达右下角的位置&#xff0c;路径上所有的数字累加起来就是路径和&#xff0c;输出所有的路径中最小的路径和。 数据范围: 1≤n,m≤500&#xff0c;矩阵中任意值都满足 0≤ai,j…

T100新程序的开发【完整步骤】

简易程序的开发 记录T100中一个简易程序的开发完整步骤。 一、程序基本数据设置作业 打开作业 azzi900,弹出作业详情。 新增一个程序编号。 一些属性概念 程序编号:手动输入你建立的新程序。程序名称:手动输入你建立的名称。归属模块:取决于你程序编号的第一个字母。归属…

C语言判断当前目录下是否存在某一个文件

要判断当前目录下是否存在文件A&#xff0c;可以使用C语言中的标准库函数access来实现。access函数用于检查指定文件是否存在及是否具有指定的访问权限。 #include <stdio.h> #include <unistd.h>int main() {const char* filename "fileName";// 检查…

MongoDB【Springboot访问MongoDB、MongoDB安全认证、MongoDB内置角色 】(五)-全面详解(学习总结---从入门到深化)

目录 Springboot访问MongoDB MongoDB安全认证 MongoDB内置角色 Springboot访问MongoDB MongoTemplate方式 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>…

【裸机开发】SPI 通信接口(一)—— SPI 通信流程及四种工作模式

目录 一、SPI 简介 二、SPI 的基本通信流程 三、SPI 的四种工作模式 1、极性和相位 2、四种工作模式 一、SPI 简介 SPI 采用主从的方式工作&#xff0c;可以一个主设备对应一个从设备&#xff0c;也可以一个主设备对应多个从设备。虽然是一个主设备对多个从设备的关系&am…

如何建立一套完整的人事管理制度?

一、什么是人事管理制度 人事管理制度是企业为有效管理和运营人力资源而建立的一系列规章制度、流程和政策。它是人力资源管理的基础&#xff0c;旨在确保企业拥有合适的员工队伍&#xff0c;并通过有效的管理和激励机制&#xff0c;使员工能够充分发挥自己的潜力&#xff0c;…

计算机网络 day2 物理层-数据链路层-帧-MAC地址 交换机的工作原理

目录 物理层&#xff08;physical layer&#xff09; 数据链路层&#xff08;Data link layer&#xff09; MAC地址&#xff1a; 网络地址&#xff1a; 帧的格式&#xff1a; MTU&#xff1a;最大传输单元 max transfer unit 1500 &#xff08;ip add可以查看&#xf…

【动态规划算法练习】day16

文章目录 一、完全背包1.题目简介2.解题思路3.代码4.运行结果 二、322. 零钱兑换1.题目简介2.解题思路3.代码4.运行结果 三、518. 零钱兑换 II1.题目简介2.解题思路3.代码4.运行结果 四、279. 完全平方数1.题目简介2.解题思路3.代码4.运行结果 总结 一、完全背包 1.题目简介 …