node中使用express+mongodb实现分页查询

2023-11-04

引言

在Web应用程序开发中,分页查询是必不可少的功能之一。Node.js提供了许多优秀的工具和框架来实现分页查询,其中最流行的框架之一就是Express。同时,MongoDB也是一款非常强大的数据库管理系统,可以轻松地实现数据的存储和查询。本文将介绍如何使用Express和MongoDB来实现分页查询功能,让你的Web应用程序更加灵活和高效。无论你是初学者还是有经验的开发者,都能从本文中获益良多。

一、分页案例

首先,您需要在项目中通过npm安装 express, mongodb 以及 mongoose 这几个模块。

$ npm install express mongoose

这是个使用 express 和 mongoose 对 MongoDB 数据库进行连接和分页查询的简单示例:

const express = require('express');
const mongoose = require('mongoose');
const app = express();
const port = 3000;

const url = 'mongodb://localhost:27017/testdb';

mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true})
.then(() => console.log('MongoDB connected...'))
.catch(err => console.log(err))


const userSchema = mongoose.Schema({
  name: String,
  email: String,
});

const User = mongoose.model('User', userSchema);


app.get('/users', async (req, res) => {
  const page = parseInt(req.query.page) || 1;  // 分页数量,默认为1
  const size = parseInt(req.query.size) || 10;  // 分页大小,默认为10
  const skip = (page - 1) * size;

  const users = await User.find().skip(skip).limit(size);
  
  res.status(200).json({users});
});


app.listen(port, () => {
  console.log(`Server running at http://localhost:${port}`);
});

在这个例子中,我们首先通过 Mongoose 连接到本地 MongoDB 数据库,并定义了一个简单的 UserSchema。然后,我们定义了一个 ‘/’ 路由处理程序,它根据查询字符串的 ‘page’ 和 ‘size’ 参数进行分页。

app.get('/users', async (req, res) => {
  const page = parseInt(req.query.page) || 1;  // 分页数量,默认为1
  const size = parseInt(req.query.size) || 10;  // 分页大小,默认为10
  const skip = (page - 1) * size;

  const users = await User.find().skip(skip).limit(size);
  
  res.status(200).json({users});
});

这个服务将会在第一页上显示前10个用户(如果存在的话),在第二页上显示下一个10个用户,依此类推。您可以通过修改查询字符串中的 ‘page’ 参数来更改页面,通过修改 ‘size’ 参数来更改每页的用户数量。

注意:此处的 User 表是模拟的案例,实际使用中要将其替换为你的 MongoDB 数据库中实际的表名。

二、查询方法扩展介绍

1. find()

find() 方法在 MongoDB 中用于查询一些指定的条件,返回匹配的所有数据。你可以指定条件,或者在 find() 内部留空来搜索集合中的所有数据。

语法:

db.collection.find(query, projection)

其中:

  • query:这是一个可选参数,用于通过 AND 来过滤所需 JSON 文档。
  • projection:这也是一个可选参数,用于通过 OR 来过滤所需 JSON 文档。

例子:
考虑一个 “students” 集合如下:

{ "_id" : 1, "name" : "Bob", "grade" : 89 }
{ "_id" : 2, "name" : "Alice", "grade" : 95 }
{ "_id" : 3, "name" : "Tom", "grade" : 85 }

如果我们想找到 grade 大于 90 的所有学生,可以这样使用 find():

db.students.find( { "grade" : { $gt : 90 } } )

这将返回:

{ "_id" : 2, "name" : "Alice", "grade" : 95 }

你也可以使用.find()方法无条件返回集合中的所有文档,只需省略查询参数即可,例如:

db.students.find()

这将返回:

{ "_id" : 1, "name" : "Bob", "grade" : 89 }
{ "_id" : 2, "name" : "Alice", "grade" : 95 }
{ "_id" : 3, "name" : "Tom", "grade" : 85 }

2. limit()

limit() 方法在 MongoDB 中用于限制返回的文档数。这个方法可以配合 skip() 方法来实现分页效果。这个方法接收一个参数,即要返回的最大记录数。

下面是一个使用的例子:

假设我们有一个叫做 orders 的集合,现在我们想要获取前 10 条订单记录。那么可以使用如下的代码:

db.orders.find().limit(10)

上面的代码会返回 orders 集合中的前 10 条文档。

如果我们想要获取第 11 到第 20 条订单记录,那么可以使用 skip() 方法来跳过前 10 条记录:

db.orders.find().skip(10).limit(10)

上面的代码会跳过 orders 集合中的前 10 条文档,然后返回接下来的 10 条文档。这样就实现了分页的效果。

3. skip()

MongoDB中的skip()方法用于在读取数据时跳过指定数量的数据。该方法一般常配合limit()方法一同使用,适用于数据分页场景。

例如,我们有一个用户表user,并且有一个需求是每页显示10个用户,现在要获取第二页的数据。那么我们可以使用skip()和limit()方法如下:

db.user.find().limit(10).skip(10);

以上述代码为例,先调用limit(10)的目的是限制本次查找操作返回的结果数量不会超过10个,然后调用skip(10)的目的是跳过头10个结果,也就是说从第11个结果开始取。因此,该操作将返回第11个到第20个结果,即对应于数据库中的第二页的用户数据。

4. populate()

在 MongoDB 中,populate() 方法被用来获取文档的引用字段的详细信息。换句话说,它被用来替换引用文档的字段。

例子如下:

假设你有两个 MongoDB 的模型,一个是 User,一个是 Post,User 模型中的每一个用户可能有多个文章。

User 模型定义如下:

const userSchema = mongoose.Schema({
  _id: mongoose.Schema.Types.ObjectId,
  name: String,
  posts: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Post' }]
});

module.exports = mongoose.model('User', userSchema);

Post 模型定义如下:

const postSchema = mongoose.Schema({
  _id: mongoose.Schema.Types.ObjectId,
  title: String,
  content: String
});

module.exports = mongoose.model('Post', postSchema);

如上我们可以看到,User 的模型里有一个 posts 字段,这个字段是一个数组,包含了一些 Post 的 _id。所以,如果我们要获得一个用户以及其所有的文章的详细信息,我们就需要用到 populate() 这个方法。

User
.findOne({ name: 'John' })
.populate('posts') // 该方法替换了 `posts` 字段里的所有 Post Id 为具体的 Post 对象。
.exec((err, user) => {
  console.log("User: ", user);  // 显示用户以及该用户的所有文章对象
});

这就是 populate() 的用法,在实际应用中,这个方法常常被用在获取关联数据的场景,非常方便且代码清晰。

注意:在 Mongoose 中,populate() 只工作在 ObjectIds 类型的字段上。同时,被引用的模型需要正确的定义及导出,否则 populate() 会找不到相应的模型从而失败。

总结

总结,在本篇博客中,我们详细探讨了如何在node.js中使用express和mongodb实现分页查询。我们首先介绍了express和mongodb的基础知识,然后我们深入讨论了如何将两者结合起来使用,实现数据的获取和分页显示。尽管实现过程可能有些复杂,但只要按照步骤操作,并充分理解每一步的意义,就能够成功实现这一功能。这不仅能提高我们的node.js开发效率,也使我们的应用具有更高的用户友好性。后面,我们还会探讨更多关于node.js和相关技术的应用,敬请期待。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

node中使用express+mongodb实现分页查询 的相关文章

随机推荐

  • 【MQTT】MQTT服务器mosquitto和客户端paho的使用

    MQTT服务器mosquitto和客户端paho mosquitto安装使用 1 mosquitto下载 从官网下载最新版本 https mosquitto org download 以下是mosquitto2 0 14windowsX64
  • Vue入门案例--TodoList备忘录

    文章目录 前言 1 创建Vue项目 2 搭建项目 2 1 MyHeader编写 2 2 MyList编写 2 3 MyItem编写 2 4 MyFooter编写 2 5 App编写 3 初始化列表 3 1 App定义数据 3 2 MyLis
  • 排序动态图

    1 冒泡排序 2 选择排序 3 鸡尾酒排序 4 插入排序 5 归并排序 6 堆排序 7 希尔排序 8 快速排序 上面的图片如果打不开 在新标签页面就可以
  • python3.7 安装Airflow中HiveToMySqlTransfer报错解决

    报错内容如下 File app python lib python3 7 site packages airflow hooks hive hooks py line 783 in get conn from pyhive hive imp
  • 百度地图BMap

    做了半天 搜到一个很好的demo 能解决多点的问题 http blog csdn net a497785609 article details 24009031 div style width 100 height 500px border
  • [大话设计模式C++版] 第9章 简历复印 —— 原型模式

    源码可以在这里找到 大话设计模式C 版 简历代码初步实现 写一个简历类 必须要有姓名 可以设置性别和年龄 可以设置工作经历 客户端实例化三份简历 main cpp include
  • docker运行报错:docker: Error response from daemon: No command specified.

    mysql镜像运行报错 docker Error response from daemon No command specified 如图 解决方案 是由于命令没启用的缘故 所以需要在运行命令后面追加 bin bash 如下图 问题解决 希
  • IDEA中找不到符号问题解决

    把以上三处的jdk从8改成11 再也不想看到这个问题了
  • 开启WSL之旅

    专业点的计算机使用者 会经常跟Linux与windows系统打交道 经常是一台计算机装双系统或者在一个系统中安装虚拟机 双系统来回切换 挺麻烦 遇到同时需要两个环境时 就没办法了 虚拟机 对于配置高的机器还可以 不过性能体验也不太好 总之是
  • “烧钱”的大模型:初探成本拆解与推理优化方法

    编者按 大模型的成本问题一直以来是大家重点关注的问题 本文重点讨论了训练大型语言模型 LLMs 需要的成本 并简要介绍什么是LLM以及一些用于优化大模型推理表现的技术 虽然很难准确预测LLMs未来会怎么发展 但可以肯定 如果成本问题得到解决
  • 服务器系统文件共享如何设置,服务器操作系统文件共享设置

    服务器操作系统文件共享设置 内容精选 换一换 切换操作系统是为您的云服务器重新切换一个系统盘 切换完成后云服务器的系统盘ID会发生改变 并删除原有系统盘 如果云服务器当前使用的操作系统不能满足业务需求 如软件要求的操作系统版本较高 您可以选
  • 思科设备命令讲解(超基础)

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的绽放 树高千尺 落叶归根人生不易 人间真情 目录 一 静态路由配置命令 二 默认路由配置命令
  • 2023年前端面试题总结

    某多多 1 Promise实现原理 2 vue组件间通信 3 性能优化 4 vuex数据流动过程 5 谈谈css预处理器机制 6 算法 Promise串行 某眼电影 1 vue组件间通信 2 react和vue更新机制的区别 3 Vue3
  • 超硬货,大型 Rust 项目经验分享

    本篇文章中 我将分享我组织大型 Rust 项目的经验 但这绝不是权威的 只是我通过尝试和错误中发现的一些小技巧 Cargo 作为 Rust 的构建系统 遵循约定大于配置的原则 它不仅为小型项目提供了一套良好的默认配置集 尤其为公共 crat
  • Flash学习笔记

    快捷键 1 F8 可以将散件转化为元件 2 Ctrl 2 满画布显示 3 F6 插入关键帧 4 Ctrl Enter 预览 一 第一章 1 颜料桶 更改填充色 墨水瓶 改变边框色 2 动画的分类 位移动画 形变动画 逐帧动画 路径动画 蒙版
  • Windows server 2012_R2 无法安装VMware Tools解决方法(详细)

    百度网盘 链接 https pan baidu com s 1QbIHSv1Df8eVAIH2ym1g8Q pwd rdi4 提取码 rdi4 官网下载链接 KB2919442https www microsoft com zh cn do
  • Table固定表头固定左侧列

    效果图 思路 把需要固定的内容进行拆封 比如左侧的表头和内容 右侧的表头和内容 都单独的存放在一个table中 在滚动条滚动的时候通过jquery scroll 区分横向纵向滚动条的方法来实现左侧内容的滚动和右侧表头的滚动 第一步 div
  • 直接线性变换解法(DLT)用于标定相机

    直接线性变换法是建立像点坐标和相应物点物方空间坐标之间直接的线性关系的算法 特点 不需要内外方位元素 适合于非量测相机 满足中 低精度的测量任务 可以标定单个相机 1 各坐标系之间的关系推导直接线性变换解法 1 1 像素坐标系与像平面坐标系
  • MATLAB中用Application Complier生成可执行文件的步骤及相关注意事项

    生成可独立执行的软件 可以分成以下5个主要的步骤 1 打开Application Complier 2 添加主程序文件 3 可执行文件设置 4 选择打包方式 5 相关文件解释 大体步骤多类似 里面有些容易出错的小细节 相关设置需要注意的有
  • node中使用express+mongodb实现分页查询

    文章目录 引言 一 分页案例 二 查询方法扩展介绍 1 find 2 limit 3 skip 4 populate 总结 引言 在Web应用程序开发中 分页查询是必不可少的功能之一 Node js提供了许多优秀的工具和框架来实现分页查询