NoteZ_技术博客 NoteZ_技术博客
🏠 首页
  • 📚 Web技术
  • 📋 Npm笔记
  • 📑 Markdown
  • 📄 Git笔记
  • 📝 Nginx文档
  • 📓 Linux文档
  • 📖 技术文档
  • 📜 其他文档
  • 🧊 NodeJs
  • 🎡 Express
  • 🔥 Rust
  • 🎉 Koa2
  • 🍃 MongoDB
  • 🐬 MySql
  • 🥦 Oracle
  • 🍁 Python
  • 🍄 JavaScript
  • 🌰 CSS
  • 🧄 HTML
  • 🥑 Canvas
  • 🌽 Nuxt
  • 🍆 React
  • 🥜 Vue
  • 🧅 TypeScript
  • 🌶️ AI
  • 📘 分类
  • 📗 标签
  • 📙 归档
⚜️ 在线编辑 (opens new window)
  • 📁 站点收藏
  • 📦 前端组件库
  • 📊 数据可视化
  • 🌈 开源插件
  • 🎗️ 关于我
  • 🔗 友情链接
GitHub (opens new window)

NoteZ_技术博客

前端界的小学生
🏠 首页
  • 📚 Web技术
  • 📋 Npm笔记
  • 📑 Markdown
  • 📄 Git笔记
  • 📝 Nginx文档
  • 📓 Linux文档
  • 📖 技术文档
  • 📜 其他文档
  • 🧊 NodeJs
  • 🎡 Express
  • 🔥 Rust
  • 🎉 Koa2
  • 🍃 MongoDB
  • 🐬 MySql
  • 🥦 Oracle
  • 🍁 Python
  • 🍄 JavaScript
  • 🌰 CSS
  • 🧄 HTML
  • 🥑 Canvas
  • 🌽 Nuxt
  • 🍆 React
  • 🥜 Vue
  • 🧅 TypeScript
  • 🌶️ AI
  • 📘 分类
  • 📗 标签
  • 📙 归档
⚜️ 在线编辑 (opens new window)
  • 📁 站点收藏
  • 📦 前端组件库
  • 📊 数据可视化
  • 🌈 开源插件
  • 🎗️ 关于我
  • 🔗 友情链接
GitHub (opens new window)
  • Express

  • Koa2

  • MongoDB

    • linux 下 mongodb 的安装及配置
    • MongoDB 备份(mongodump)与恢复(mongorestore)
    • MongoDB 插入(insert)数据的正确方法
    • MongoDB 数据库
    • MongoDB 数据库设置账号密码(权限)
    • MongoDB集合数据查询总结
    • Mongoose 动态给 Schema 添加属性
    • Mongoose 数据验证
    • NodeJs 连接操作 MongoDB 数据库
    • Node下使用MongoDB 数据库多条件模糊查询
    • 使用 JS 操作 MongoDB 命令
    • 如何解决Mongodb大数据量分页查询效率问题
      • 1、简单的分页查询
      • 2、大数据量分页查询
      • 3、获取总条数
      • 4、部分使用案例
    • 给MongoDB数据库bin目录添加工具集
  • MySql

  • NodeJs

  • Oracle

  • Rust

  • Python

  • 后端开发
  • MongoDB
NoteZ
2022-08-08
目录

如何解决Mongodb大数据量分页查询效率问题

最常见的分页方式是采用skip+limit这种组合方式,这种方式对与小数据倒也可以,但是对与上几百上千万的大数据,只能力不从心,skip如果跳过大量的数据会很慢,并且会越查越慢。

# 1、简单的分页查询

最常见的分页采用的是skip+limit这种组合方式,这种方式对付小数据倒也可以,但是对付上几百上千万的大数据,只能力不从心,skip如果跳过大量的数据会很慢,并且会越查越慢。

const list = db.getCollection('logs').count({
	_id: 'dafasdfergr12vs12fe'
}).skip(300).limit(10);
1
2
3

# 2、大数据量分页查询

针对这一情况,可以通过条件查询+排序+限制返回记录,即 边查询,边排序,排序之后,抽取上一页中的最后一条记录,作为当前分页的查询条件,从而避免了skip效率低下的问题。

db.getCollection('logs').find({
    _id: 'dafasdfergr12vs12fe',
    key1:{$gt: '#上一条记录的排序值#'}
}).limit(20)
1
2
3
4

不过在项目使用过程中,发现后面的数据基本没有用,所以用了一个阉割版的办法,如果条目数大于特定值 比如10000条,则只返回前10000条,否则返回全部,即只能查看前10000条; 再想看更多结果的话 就得用缩小插叙范围来解决了:

const total_count = 10000;
const list = db.getCollection('logs').find({
	_id: 'dafasdfergr12vs12fe'
}).skip(10000).limit(1);
 
if (list.length === 0) {
	total_count = db.getCollection('logs').count({
		_id: 'dafasdfergr12vs12fe'
	})
}
1
2
3
4
5
6
7
8
9
10

这个方法虽然多了一次数据库查询,但是对于几十万往上的查询结果分页来说,提升的性能还是很客观的。

# 3、获取总条数

dataBase.find().count(function (err, count) {
	if (err) {
		console.log(err);
	} else {
	    console.log(count);
	}
})
1
2
3
4
5
6
7

# 4、部分使用案例

router.get('/get/data', (req, res, next) => {
    let { pageSize, pageNo, page_id, _id, bid } = req.query;

    pageSize = pageSize ? pageSize * 1 : 200;
    pageNo = pageNo ? pageNo * 1 - 1 : 0;
    let filter = {};
    if (page_id) {
        filter._id = { $gt: page_id };
        pageNo = 0
    };
    if (_id) {
        filter._id = _id;
        pageNo = 0
    };
    if (bid) {
        filter.bid = bid;
        pageNo = 0
    };

    let p1 = new Promise((resolve, reject) => {
        dataBase.find(filter, (err, data) => {
            if (err) {
                reject(err)
            } else {
                resolve(data)
            }
        }).skip(pageNo * pageSize).limit(pageSize)
    })

    let p2 = new Promise((resolve, reject) => {
        dataBase.find().count(function (err, count) {
            if (err) {
                reject(err)
            } else {
                resolve(count)
            }
        })
    })

    Promise.all([p1, p2]).then((result) => {
        res.json({ data: result[0], count: result[1], code: 200 });
    }).catch((error) => {
        console.log(error)
        res.json({ result: false, code: 500 });
    })
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#MongoDB
上次更新: 2024/01/30, 00:35:17
使用 JS 操作 MongoDB 命令
给MongoDB数据库bin目录添加工具集

← 使用 JS 操作 MongoDB 命令 给MongoDB数据库bin目录添加工具集→

最近更新
01
Gitea数据备份与还原
03-10
02
Linux 中使用 rsync 同步文件目录教程
03-10
03
Linux 使用 rsync 互相传输同步文件的简单步骤
03-08
更多文章>
Theme by Vdoing | Copyright © 2019-2025 NoteZ,All rights reserved | 冀ICP备2021027292号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式