整理mongodb文档:分页

news2024/12/23 18:07:17

个人博客
整理mongodb文档:分页

个人博客,求关注,如果文章不够清晰,麻烦指出。

文章概叙

本文主要讲下在聚合以及crud的find方法中如何使用limit还有skip进行排序。
分页的情况很经常出现,这也是这篇博客诞生的理由。

数据准备

为了方便后续的测试,这次需要准备的数据有点多,大概是一百万条。
百万级的数量能反应出skip的性能问题(毕竟用到db,必须得注意性能问题)

db.test
    .insertMany(
        new Array(1000000).fill(1).map(
            (value, index) => ({ number: index })
        ))

首先介绍下两位主角,一个是limit,一个是skip。

如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。

我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

当您链接skip()和limit()时,方法链接顺序不会影响结果。服务器始终在应用限制要返回的文件数量
简单来说,我们在mysql之类的关系型数据库中使用的pagesize、pageno这些参数现在不适合了。

mongodb的分页查询,是需要两个参数,一个是跳过多少条,一个是需要查询多少条,下面举一个简单的例子:
假设我们要查询第6页的10条数据,我们需要设置我们的skip为(6-1)*10=50,设置我们的limit为10,也就是说前50条的数据被我们跳过了。

有了初步的理解,再分别介绍下如何在聚合以及find方法中使用分页。

find方法中的分页

由于在find方法中,是没有limit以及skip参数的,所以我们会直接在代码中使用skip方法以及limit方法。

db.test
    .find()
    .limit(1)
    .skip(10)

按照上面的讲述,我们查询了第11条开始的共计1条数据。

在这里插入图片描述

至此,你已经学会了如何在find方法中使用分页了,但请不要忽略文档中的一句话。

The skip() method requires the server to scan from the beginning of
the input results set before beginning to return results. As the
offset increases, skip() will become slower.

大体的翻译是:随着查询数据的不断增多,skip查询越后面的数据,返回越慢。
为了验证,我们需要搬出来我们的explain方法来查看更多的详情。
我们可以根据代表在该查询条件下返回文档数的"nReturned"来验证上面的说法。

首先,我们查询第11条数据,并使用explain查看查询的详情。

db.test
    .find()
    .limit(1)
    .skip(10)
    .explain("executionStats")

在这里插入图片描述

接着,再查询最后一条数据。

db.test
    .find()
    .limit(1)
    .skip(999999)
    .explain("executionStats")

在这里插入图片描述

而且在查询第1000000条数据的时候,也可以感觉到明显的卡顿。
根据nReturned的不同,我们就明白了当skip的值越大的时候,我们查询出来的文档数也就越多,会导致 性能下降,会出现查询缓慢的情况。

聚合通道的分页

聚合通道的分页,由于直接提供了"$limt"以及"$skip",使得我们不需要在后面拼接skip方法以及limit方法,使用的方法如下:

db.test
    .aggregate([
        { "$limit": 3 },
        { "$skip": 1 }
    ])

上述的代码中,我们单看代码的理解是:查询从第2条开始的3条数据,也就是number分别为1,2,3的三条数据。
那么让我们打印看看查询出来的结果。
在这里插入图片描述

很是出乎意料,只返回了两条数据,并且返回的number还是数据库中的第二条以及第三条,说明了skip以及limit是有执行顺序的,先执行了limit的,拿出了前三条数据,再跳过这三条数据的第1条,只留下最后的两条数据。
既然如此,我们使用aggregate对skip做操作的时候,就需要考虑到执行顺序问题了。

注意点

1.上述在聚合通道的实验中,可以看到我们的顺序影响了分页的效果,所以使用分页的时候,需要注意分页所放的位置。

2.在find方法中,skip的作用是直接先将数据整理完毕,然后再查询出来,可以预测当我们要查询的数据特别后的时候,会导致我们的查询变得很慢,这也是因为一条一条数据的查询过滤。所以使用skip的时候,需要注意数据量大了就会导致性能急剧下降的问题,我们就可以尽可能的缩小查询的范围,适当的使用索引。

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

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

相关文章

如何使用SQL系列 之 理解什么是关系数据库

简介 数据库管理系统 (DBMS)是允许用户与数据库交互的计算机程序。DBMS允许用户控制对数据库的访问、写入数据、执行查询以及执行与数据库管理相关的任何其他任务。 为了执行这些任务,DBMS必须有某种底层模型来定义数据的组织方式。关系模型是一种组织数据的方法&…

vue自定义键盘

<template><div class"mark" click"isOver"></div><div class"mycar"><div class"mycar_list"><div class"mycar_list_con"><p class"mycar_list_p">车牌号</p>…

OpenCV(一):Android studio jni配置OpenCV(亲测有效,保姆级)

目录 1.下载OpenCV的SDK 2.创建Android Native C项目 3.Android项目中导入OpenCV工程 4.导入OpenCV的库文件 5.实现opencv高斯模糊图像处理的demo 要在Android Studio中配置使用OpenCV库的C方法&#xff0c;需要完成以下步骤&#xff1a; 1.下载OpenCV的SDK 首先&#x…

SpringBoot项目配置文件数据库用户名密码加密

1、需求 在使用SpringBoot开发过程中&#xff0c;会将一些敏感信息配置到SpringBoot项目的配置文件中(不考虑使用配置中心的情况 )&#xff0c;例如数据库的用户名和密码、Redis的密码等。为了保证敏感信息的安全&#xff0c;我们需要将此类数据进行加密配置。 2、操作步骤 …

<Linux>《SHELL脚本在crontab环境下执行失败问题处理》>> 探索SHELL运行模式和加载环境变量【实践+实验】

《SHELL脚本在crontab环境下执行失败问题处理》>> 探索SHELL运行模式和加载环境变量【实践实验】 1 现象描述2 分析3 解决方法4 深层研究4.1 shell4.2 shell脚本的环境变量4.3 shell脚本四种执行方法4.4 source 、.、./、bash 的区别4.5 shell常用的一些参数4.6 shell常见…

Netty源码NioEventLoop解析

带着问题源码 Netty 的 NioEventLoop 是如何实现的&#xff1f;它为什么能够保证 Channel 的操作是线程安全的&#xff1f;Netty 如何解决 JDK epoll 空轮询 Bug&#xff1f;NioEventLoop 是如何实现无锁化的&#xff1f; 一、作用与设计原理 Netty的NioEventLoop并不是一个存…

基于Spring Boot的住院病人管理系统设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的住院病人管理系统设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java spring…

JavaScript基础04

JavaScript 基础 文章目录 JavaScript 基础函数声明和调用声明&#xff08;定义&#xff09;调用 参数形参和实参 返回值作用域全局作用域局部作用域 匿名函数函数表达式立即执行函数 理解封装的意义&#xff0c;能够通过函数的声明实现逻辑的封装&#xff0c;知道对象数据类型…

大数据项目实战(安装Hive)

一&#xff0c;搭建大数据集群环境 1.3 安装Hive 1.3.1 Hive的安装 1.安装MySQL服务 1&#xff09;检查是否安装MySQL&#xff0c;如安装将其卸载。卸载命令 rpm -qa | grep mysql 2&#xff09;搜索MySQL文件夹&#xff0c;如存在则删除 find / -name mysql rm -rf /etc/s…

低代码赋能| 绿色智慧矿山解决方案

在世界能源日趋紧张的背景下&#xff0c;能源产业的数字化升级是大势所趋。矿山行业作为国家能源安全的“压舱石”&#xff0c;也必须进行产业升级。一直以来&#xff0c;国家都在大力推动智慧矿山建设。通过大数据、GIS、物联网、云计算、人工智能等新兴技术&#xff0c;实现矿…

Leetcode 461.汉明距离

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y&#xff0c;计算并返回它们之间的汉明距离。 示例 1&#xff1a; 输入&#xff1a;x 1, y 4 输出&#xff1a;2 解释&#xff1a; 1 (0 0 0 1) 4 (0 1 0 0)↑ ↑ 上面的…

Mysql redolog

一、redolog 是啥 数据库的ACID&#xff1a;A原子性&#xff0c;C一致性&#xff0c;I隔离性&#xff0c;D持久性&#xff1b; redolog&#xff1a;保证 持久性&#xff1b; redolog: 系统奔溃重启时需要按照上述内容所记录的步骤重新更新数据页&#xff0c;特点&#xff1a…

微服务架构七种模式

微服务架构七种模式 目录概述需求&#xff1a; 设计思路实现思路分析 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive.…

软件架构设计(三) B/S架构风格-层次架构(一)

层次架构风格从之前的两层C/S到三层C/S,然后演化为三层B/S架构,三层B/S架构之后仍然在往后面演化,我们来看一下层次架构演化过程中都有了哪些演化的架构风格呢? 而我们先简单了解一下之前的层次架构风格中分层的各个层次的作用。 表现层:由于用户进行交互,比如MVC,MVP,…

iOS脱壳之frida-ios-dump

frida-ios-dump介绍 该工具基于frida提供的强大功能通过注入js实现内存dump然后通过python自动拷贝到电脑生成ipa文件&#xff0c;适合现iOS11版本之后的越狱手机使用。 下载 https://github.com/AloneMonkey/frida-ios-dump环境安装 电脑环境安装 win和Mac 环境一样都是…

Metinfo6.0.0任意文件读取漏洞复现

漏洞原理 在\MetInfo6.0.0\app\system\include\module\的old_thumb.class.php文件 可以看到这里对./进行了严格的过滤&#xff0c;但是却忽略了在Windows下还可以用…\来跳转目录 环境搭建 下载Metinfo6.0.0 配置随便写&#xff0c;自己记住就行 这里前面已经审计过代码了&a…

linux离线环境安装redis

先检查gcc版本&#xff0c;使用gcc --version进行检查&#xff0c;版本在5以下的&#xff0c;安装redis要安装redis6以下的版本 如果没有gcc命令&#xff0c;要先安装gcc命令。因为是离线环境&#xff0c;yum命令什么的用不了。为了安装gcc&#xff0c;进行了几种尝试。 1、下…

Java设计模式:四、行为型模式-06:观察者模式

文章目录 一、定义&#xff1a;观察者模式二、模拟场景&#xff1a;观察者模式2.1 观察者模式2.2 引入依赖2.3 工程结构2.4 模拟摇号2.4.1 摇号服务接口2.4.2 摇号返回结果类 三、违背方案&#xff1a;观察者模式3.0 引入依赖3.1 工程结构3.2 添加摇号接口和实现3.2.1 摇号服务…

Nuxt 菜鸟入门学习笔记五:CSS 样式

文章目录 本地样式表在组件内导入通过 Nuxt 配置 CSS 属性导入使用字体导入通过 NPM 发布的样式表 外部样式表动态添加样式表【高级】使用 Nitro 插件修改渲染的头部 使用预处理器单文件组件 SFC 样式类和样式绑定使用 v-bind 的动态样式Scoped StylesCSS Modules预处理器支持 …

vue3中axios的使用方法

在Vue 3中使用axios发送HTTP请求的方法与Vue 2中基本相同。首先&#xff0c;需要安装axios库&#xff1a; npm install axios然后&#xff0c;在Vue组件中引入axios&#xff1a; import axios from axios;接下来&#xff0c;可以在Vue组件的方法中使用axios发送HTTP请求。例如…