Nest 复杂查询示例解析

目录
  • Nest 复杂查询
    • QueryUserDto是查询参数类型
    • UserService如何实现

Nest 复杂查询

复杂查询包括分页、模糊查询、多条件筛选、排序等,满足前端对查询的所有诉求。

Nest 复杂查询,主要使用 repository.findAndCount()方法实现。

假设有一个能分页查询所有用户,可根据用户名进行筛选,并对结果按照更新时间倒序排序的需求,它的 controller 如下:

  @Post()
  @Roles(Role.Admin, Role.SuperAdmin)
  async pageQuery(@Body() dto: QueryUserDto) {
    const res = await this.userService.pageQuery(dto);
    return successResult(res);
  }

QueryUserDto是查询参数类型

// BaseQueryDto.ts
import { IsNotEmpty, IsNumber } from 'class-validator';
export class BaseQueryDto {
  @IsNotEmpty()
  @IsNumber()
  page: number;
  @IsNotEmpty()
  @IsNumber()
  pageSize: number;
}
// QueryUserDto.ts
export class QueryUserDto extends BaseQueryDto {
  username: string;
}

UserService如何实现

// user.service.ts
async pageQuery(dto: QueryUserDto) {
    const { username, pageSize, page } = dto;
    // 筛选状态为正常的数据
    const queryFilter: any = { status: DATA_STATUS.NORMAL };
    if (username) {
      // 模糊查询 username
      queryFilter.username = Like(`%${username}%`);
    }
    const res = await this.userRepository.findAndCount({
      // 查询条件
      where: queryFilter,
      // 排序
      order: { updateTime: 'DESC' },
      // offset,分页的偏移量
      skip: (page - 1) * pageSize,
      // 每页条数
      take: pageSize,
      // 是否缓存
      cache: true,
    });
    return loadPageQueryResult(res, pageSize);
  }
// 拼接返回结果的数据结构
export function loadPageQueryResult(findAndCountRes: any, pageSize: number) {
  const list = findAndCountRes[0];
  const totalCount = findAndCountRes[1];
  const totalPage = Math.ceil(totalCount / pageSize);
  return {
    list,
    totalCount,
    totalPage,
  };
}

通过 findAndCount()方法可以一次性得到想要的结果,它支持传入多个参数。
where 主要传入查询条件,是一个对象,对象的 key 是数据库字段,value 是要查询的值,把上面的 queryFilter 合并一下,就是如下这种形式,要查多少个属性都可以。

{
  status: DATA_STATUS.NORMAL,
  username: Like(`%${username}%`)
}

以上就是Nest 复杂查询示例解析的详细内容,更多关于Nest 复杂查询的资料请关注我们其它相关文章!

(0)

相关推荐

  • 使用Nest.js实现接口教程示例

    目录 一.项目初始化 二.核心文件介绍 三.创建一个接口模块,处理请求 四.看看cats模块有啥吧 1.先看controller吧,请求方法都在这了 2.你这地址有点单调啊,能不能接收query参数的? 五.连接mysql数据库 六.操作数据库 七.中间件你应该了解过吧,在这里应该怎么用呢 一.项目初始化 1.安装脚手架 npm i -g @nestjs/cli 2.创建项目 nest new 项目名称 3. cd 到项目 4.安装依赖 npm i 5.启动项目,监视文件,自动重新编译和重新加载

  • 从reflect metadata理解Nest实现原理

    目录 正文 入口Module 引入模块 CatsService操作数据库 Reflect Metadata 那元数据存在哪呢? nest 的源码: 总结 正文 Nest 是 Node.js 的服务端框架,它最出名的就是 IOC(inverse of control) 机制了,也就是不需要手动创建实例,框架会自动扫描需要加载的类,并创建他们的实例放到容器里,实例化时还会根据该类的构造器参数自动注入依赖. 它一般是这样用的: 入口Module 引入模块 比如入口 Module 里引入某个模块的 Mo

  • Flutter Widgets粘合剂CustomScrollView NestedScrollView滚动控件

    目录 概述: CustomScrollView 相互嵌套场景 NestedScrollView 滚动隐藏AppBar SliverAppBar展开折叠 与TabBar配合使用 总结: 概述: Flutter中常用的滑动布局 ScrollView 有 SingleChildScrollView.NestedScrollView.CustomScrollView. SingleChildScrollView 用来处理简单可滑动的页面布局视图,如一般的数据详情页面,当内容足够多时,一屏显示不下时,就需

  • Docker Compose+Nestjs构建Dapr Redis发布订阅分布式应用

    目录 Dapr(分布式应用程序运行时)介绍 实战 Dapr 的 Redis 发布/订阅应用 1. 创建项目 2. 创建 Dapr Placement 服务 3. 创建 Redis Publish 服务 4. 创建 Dapr Pub-Sub 组件 5. 创建 Redis Dapr Sidecar 6. 创建 NestJS Server 7. 为 NestJS 订阅服务器创建 Dockerfile 8. 将 NestJS 订阅服务添加到 docker-compose 文件 9. 创建 Dapr 订阅

  • Dapr+NestJs编写Pub及Sub装饰器实战示例

    目录 系列 Dapr JavaScript SDK 安装 结构 实战 Demo 源码 准备环境和项目结构 注入 Dapr 赖项 配置 Dapr 组件(rabbitMQ) API/Gateway 服务 内部监听微服务 @DaprPubSubscribe 装饰器 运行应用程序 Dapr 是一个可移植的.事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的.无状态和有状态的应用程序,并可运行在云平台或边缘计算中,它同时也支持多种编程语言和开发框架.Dapr 确保开发人员专注于编写业务逻辑,不必分神解

  • Nest.js快速启动API项目过程详解

    目录 快速启动 使用nest自带的命令行工具 直接使用starter项目 用npm安装所需的包 创建controller 创建service 结构和命名 HTTP请求 处理Axios对象 配置 全局添加headers API文档 快速启动 最近上了一个新项目,这个客户管理一个庞大的任务和团队集群,而不同流程所适用的系统也不太一样,比如salesforce,hubspots之类的.这次的新项目需要在另外两个平台之间做一些事情.目前只需要先封装其中之一的API,因此我们选定使用NodeJS的框架Ne

  • Nest框架中集成使用Swagger示例说明

    目录 Swagger Nest 中使用 Swagger 安装 初始化 Swagger 接口中使用 Swagger Swagger 是一个能够生成.描述.调用和可视化的 RESTful 风格的 Web 服务.主要是对 REST API 接口自动生成接口说明文档.生成的接口文档也是直接在线测试.即在可视化的Web 界面上直接输入参数对应的值就可以在线测试接口. Nest 框架也提供了一个专门用于支持 Swagger 规范的模块. Nest 中使用 Swagger 安装 首先需要安装所需要的 swag

  • Nest 复杂查询示例解析

    目录 Nest 复杂查询 QueryUserDto是查询参数类型 UserService如何实现 Nest 复杂查询 复杂查询包括分页.模糊查询.多条件筛选.排序等,满足前端对查询的所有诉求. Nest 复杂查询,主要使用 repository.findAndCount()方法实现. 假设有一个能分页查询所有用户,可根据用户名进行筛选,并对结果按照更新时间倒序排序的需求,它的 controller 如下: @Post() @Roles(Role.Admin, Role.SuperAdmin) a

  • GO语言类型查询类型断言示例解析

    目录 类型查询 1.comma-ok断言 2. switch测试 类型断言 类型查询 我们知道interface的变量里面可以存储任意类型的数值(该类型实现了interface).那么我们怎么反向知道这个变量里面实际保存了的是哪个类型的对象呢?目前常用的有两种方法: comma-ok断言 switch测试 1.comma-ok断言 Go语言里面有一个语法,可以直接判断是否是该类型的变量: value, ok = element.(T),这里value就是变量的值,ok是一个bool类型,elem

  • Elasticsearch查询之Term Query示例解析

    目录 Term Query 基本语法 Java代码写法 Terms-匹配多个值 基本语法 Java写法 Term查询可配置的其他参数 总结 Term Query Term Query是一种最基本的查询方式,它用于在Elasticsearch中查询一个字段中包含指定关键词的文档,与MySQL中的等值查询类似.使用Term Query时,可以对字段进行完全匹配,且区分大小写. 基本语法 GET /{index}/_search { "query": { "term":

  • Java正则表达式的语法及示例解析

    1匹配验证-验证Email是否正确 Java | 复制 public static void main(String[] args) { // 要验证的字符串 String str = "service@xsoftlab.net"; // 邮箱验证规则 String regEx = "[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\\.){1,3}[a-zA-z\\-]{1,}"; // 编译正则表达式 Pattern pat

  • Oracle PL/SQL中异常高级特性示例解析

    PL/SQL(Procedural Language/SQL,过程语言/SQL)是结合了Oracel过程语言和结构化查询语言(SQL)的一种扩展语言. 优点: (1)PL/SQL具有编程语言的特点,它能把一组SQL语句放到一个模块中,使其更具模块化种序的特点. (2)PL/SQL可以采用过程性语言控制程序的结构. (3)PL/SQL有自动处理的异常处理机制. (4)PL/SQL程序块具有更好的可移植性,可移植到另一个Oracle数据库中. (5)PL/SQL程序减少了网络的交互,有助于提高程序性

  • flask的orm框架SQLAlchemy查询实现解析

    这篇文章主要介绍了flask的orm框架SQLAlchemy查询实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一对多,多对多是什么? 一对多.例如,班级与学生,一个班级对应多个学生,或者多个学生对应一个班级. 多对多.例如,学生与课程,可以有多个学生修同一门课,同时,一门课也有很多学生. 一对多查询 如果一个项目,有两张表.分别是班级表,学生表. 在设计数据表时,我们给学生表设置一个外键,指向班级表的 id . sqlalchemy

  • java使用elasticsearch分组进行聚合查询过程解析

    这篇文章主要介绍了java使用elasticsearch分组进行聚合查询过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java连接elasticsearch 进行聚合查询进行相应操作 一:对单个字段进行分组求和 1.表结构图片: 根据任务id分组,分别统计出每个任务id下有多少个文字标题 1.SQL:select id, count(*) as sum from task group by taskid; java ES连接工具类 p

  • Python sqlite3查询操作过程解析

    这篇文章主要介绍了Python sqlite3查询操作过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 记录查询操作及获取查询结果列字段的方法 1.sqlite3 中获取所有表名及各表字段名的操作方法 SQLite 数据库中有一个特殊的表叫 sqlite_master,sqlite_master 的结构如下: CREATE TABLE sqlite_master ( type TEXT, name TEXT, tbl_name TEXT,

  • C++实现学生管理系统示例解析

    此项目为一个小型学生管理系统,仅供初学者学习交流使用,使用者可以在此项目中用已学的C++基础知识进行实战演练,加深对所学知识的了解. 可以从github直接克隆项目(项目地址) 1. 项目要点 1.在每次进入最初登陆界面时,由于要再次加载文件内容,因此需先将list underst 和 list ad 中的内容使用clear()函数清空后再读入. 2.在读取文件时,由于使用!infile.eof()函数会导致最后一行读取两次.因此,在读文件循环内加入infile.get(),目的是在读完一行后立

  • java爬取豆瓣电影示例解析

    为什么我们要爬取数据 在大数据时代,我们要获取更多数据,就要进行数据的挖掘.分析.筛选,比如当我们做一个项目的时候,需要大量真实的数据的时候,就需要去某些网站进行爬取,有些网站的数据爬取后保存到数据库还不能够直接使用,需要进行清洗.过滤后才能使用,我们知道有些数据是非常真贵的. 分析豆瓣电影网站 我们使用Chrome浏览器去访问豆瓣的网站如 https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=re

随机推荐