MongoDB - 构造复杂查询条件执行查询
文章目录
- 1. 构造 keyword 的查询条件
- 2. 构造 threatSubType 的查询条件
- 3. 相应的实体类
/*** 查询白名单详情** @param offset 第几页开始* @param limit 每页显示的最大值* @param keyword 模糊搜索值* @param order 排序方式(升序/降序)* @param sortKey 排序的字段* @param threatSubType 告警类型* @return 白名单实体列表*/
List<AlertWhiteEntity> findListByKeyword(Integer offset, Integer limit, String keyword, String order,String sortKey, List<String> threatSubType
);
@Override
public List<AlertWhiteEntity> findListByKeyword(Integer offset, Integer limit, String keyword, String order,String sortKey,List<String> threatSubType
) {// 开始构造查询条件Query query = new Query();// 1. 构造 keyword 的查询条件if (!StringUtils.isEmpty(keyword)) {query.addCriteria(dealKeyword(keyword));}// 2. 构造排序规则,默认是降序排序 Sort.Order orderSort = Sort.Order.desc(sortKey);if (Objects.equals(order, ASC)) {orderSort = Sort.Order.asc(sortKey);}// 3. 构造 threatSubType 的查询条件getThreatSubTypeFilter(threatSubType, query);// 4. 对status按照指定排序规则排序query.with(Sort.by(Sort.Order.desc("status"), orderSort));// 5. 分页查询query.skip((long) (offset - 1) * limit).limit(limit);// 执行查询return incidentMongoTemplate.find(query, AlertWhiteEntity.class);
}
1. 构造 keyword 的查询条件
private CriteriaDefinition dealKeyword(String keyword) {// Java的正则表达式库创建了一个正则表达式模式对象:匹配任意位置包含指定关键字的字符串,并且不区分大小写。Pattern pattern = Pattern.compile("^.*" + keyword + ".*$", Pattern.CASE_INSENSITIVE);Criteria criteria = new Criteria();Criteria[] criteriaArray = null;String fullIp = "";// ruleList.ruleList 中存在一个元素,该元素满足以下条件:type字段等于"srcIp"或"dstIp",value字段匹配给定的正则表达式pattern// creator 字段匹配给定的正则表达式pattern// name 字段匹配给定的正则表达式pattern// ruleList.ipRange 中存在一个元素,该元素的value满足以下条件: startIp字段小于等于给定的fullIp,endIp字段大于等于给定的fullIpif (IpUtil.judgeLegalIp(keyword)) {if (IpUtil.judgeIpv6(keyword)) {fullIp = IpUtil.formatIpv6Full(keyword);} else if (IpUtil.judgeIpv4(keyword)) {fullIp = IpUtil.formatIpv4Full(keyword);}criteriaArray = new Criteria[] {new Criteria().and("ruleList.ruleList").elemMatch(new Criteria().andOperator(new Criteria().orOperator(new Criteria().and("type").is("srcIp"), new Criteria().and("type").is("dstIp")), new Criteria().and("value").regex(pattern))),new Criteria().and("creator").regex(pattern),new Criteria().and("name").regex(pattern),new Criteria().and("ruleList.ipRange").elemMatch(new Criteria().and("value").elemMatch(new Criteria().andOperator(Criteria.where("startIp").lte(fullIp), Criteria.where("endIp").gte(fullIp))))};// 查询ruleList.ruleList中满足以下条件的元素:type字段等于"srcIp"或者"type"字段等于"dstIp",value字段匹配正则表达式pattern// 查询creator字段匹配正则表达式pattern的文档// 查询name字段匹配正则表达式pattern的文档} else {criteriaArray = new Criteria[] {new Criteria().and("ruleList.ruleList").elemMatch(new Criteria().andOperator(new Criteria().orOperator(new Criteria().and("type").is("srcIp"), new Criteria().and("type").is("dstIp")), new Criteria().and("value").regex(pattern))),new Criteria().and("creator").regex(pattern),new Criteria().and("name").regex(pattern)};}criteria.orOperator(criteriaArray);return criteria;
}
2. 构造 threatSubType 的查询条件
private void getThreatSubTypeFilter(List<String> threatSubType, Query query) {// 如果threatSubType不为null或者列表不为空,将“all”添加为列表,代表需要值为查询“全部”的文档if (threatSubType != null && threatSubType.size() != 0) {if (!threatSubType.contains(ALL)) {threatSubType.add(ALL);}// 查询threatSubTypeId在threatSubType列表中的文档query.addCriteria(Criteria.where("threatSubTypeId").in(threatSubType));}// 查询 deleted 为false 的文档query.addCriteria(Criteria.where("deleted").is(false));
}
3. 相应的实体类
@Data
@Document("t_alert_white_rules")
public class AlertWhiteEntity {@JsonProperty("_id")@MongoId@ApiModelProperty(value = "元api id")@JsonSerialize(using = ObjectIdSerializer.class)private ObjectId id;@Field("whiteId")@ApiModelProperty(value = "白名单id")private String whiteId;@Field("alertType")@ApiModelProperty(value = "告警类型,前端使用控制展示哪种模板")private String alertType;@ApiModelProperty(value = "告警类型,前端使用控制渲染告警类型")private String originAlertType;@Field("threatSubType")@ApiModelProperty(value = "攻击小类数量", example = "{[\"label\":\"aaaa\",\"value\":\"1_2_3\"]}")private List<WhiteScreenEntity> threatSubType;@Field("threatSubTypeView")@ApiModelProperty(value = "攻击小类展示数组", example = "[\"aaa\"]")private List<String> threatSubTypeView;@Field("threatSubTypeId")@ApiModelProperty(value = "攻击小类ID数组", example = "[\"1_2_3\"]")private List<String> threatSubTypeId;@Field("hostIp")@ApiModelProperty(value = "生效主机", example = "1.1.1.1")private List<String> hostIp;@Field("isHostAll")@ApiModelProperty(value = "是否勾选全部")private Boolean isHostAll;@Field("repeatMd5")@ApiModelProperty(value = "用于判断是否重复md5")private String repeatMd5;@Field("status")@ApiModelProperty(value = "状态", notes = "启用enable | 禁用disable")private String status;@Field("name")@ApiModelProperty(value = "规则名称")private String name;@Field("isUnlimited")@ApiModelProperty(value = "是否永久生效", notes = "永久生效1 | 自定义0")private Integer isUnlimited;@Field("sort_status")@ApiModelProperty(value = "分类状态", notes = "status是enable时1 | status是disable时0")private Integer sortStatus;@Field("reason")@ApiModelProperty(value = "备注")private String reason;@Field("ruleList")@ApiModelProperty(value = "规则列表")private RuleEntity ruleList;@Field("creator")@ApiModelProperty(value = "创建人")private String creator;@Field("creatorId")@ApiModelProperty(value = "创建人Id")private String creatorId;@Field("startTime")@ApiModelProperty(value = "开始时间")private Long startTime;@Field("endTime")@ApiModelProperty(value = "结束时间")private Long endTime;@Field("createTime")@ApiModelProperty(value = "创建时间")private long createTime;@Field("updateTime")@ApiModelProperty(value = "更新时间")private long updateTime;@Field("deleted")@ApiModelProperty(value = "是否删除", notes = "否0 | 是1")private boolean deleted;
}
@Data
public class RuleEntity {@ApiModelProperty(value = "规则列表")private List<RuleInfoEntity<String>> ruleList;@ApiModelProperty(value = "IP范围")private List<RuleInfoEntity<IpInfoEntity>> ipRange;@ApiModelProperty(value = "IOA类型")private List<List<RuleInfoEntity<String>>> ioaRuleList;}
@AllArgsConstructor
@NoArgsConstructor
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
@ApiModel(description = "匹配规则")
public class RuleInfoEntity<T> implements ValidateAble {@ApiModelProperty(value = "匹配字段", required = true, example = "srcIp")private String type;/**** 该值用于处理view进行转换,不接收来自调用者*/@ApiModelProperty(value = "匹配值", required = true)private List<T> value;@ApiModelProperty(value = "TMG匹配值", required = true)private List<T> tmgValue;@ApiModelProperty(value = "中文名称", example = "srcIp")private String title;@ApiModelProperty(value = "匹配模式", required = true, example = "IN")private String mode;@ApiModelProperty(value = "匹配值")private List<String> view;@ApiModelProperty(value = "是否忽略大小写")private Boolean isIgnorecase;
}
@Data
public class IpInfoEntity {@ApiModelProperty(value = "开始IP")private String startIp;@ApiModelProperty(value = "结束ip")private String endIp;}
相关文章:

MongoDB - 构造复杂查询条件执行查询
文章目录 1. 构造 keyword 的查询条件2. 构造 threatSubType 的查询条件3. 相应的实体类 /*** 查询白名单详情** param offset 第几页开始* param limit 每页显示的最大值* param keyword 模糊搜索值* param order 排序方式(升序/降序…...

如何从ChatGPT中获得最佳聊天对话效果
从了解ChatGPT工作原理开始,然后从互动中学习,这是一位AI研究员的建议。 人们利用ChatGPT来撰写文章、论文、生成文案和计算机代码,或者仅仅作为学习或研究工具。然而,大多数人不了解它的工作原理或它能做什么,所以他…...

深入浅出:手把手教你实现单链表
一、什么是链表 链表是一种链状数据结构。简单来说,要存储的数据在内存中分别独立存放,它们之间通过某种方式相互关联。 如果我们使用C语言来实现链表,需要声明一个结构体作为链表的结点,结点之间使用指针关联。 二、单向链表的结…...

vite 打包项目后访问显示空白页的问题,开发环境正常,生产环境无报错。
有没有可能, 你跟我遇到同样的问题 白屏的写法 const routes [{path: /,component: import(../views/index.vue),} ]正确的写法 const routes [{path: /,component: () > import(../views/index.vue),} ]有时候方向很重要,当在错误的方向上无脑冲…...

打造成功的砍价营销大解析,销量飙升
砍价活动是吸引顾客的一种有效方式,可以帮助提高销量和提升品牌知名度。在乔拓云平台上,我们提供了一套简单易用的工具,让您能够轻松地制作一个成功的砍价活动。下面,我将详细介绍具体步骤,让您能够轻松上手。 第一步&…...

【Flink进阶】- Flink kubernetes operator 常用的命令
目录 1、应用程序管理 (1)提交 Flink 应用程序 (2)查看 Flink 应用程序列表...

ASP.NET Core 的日志系统
ASP.NET Core 提供了丰富日志系统。 可以通过多种途径输出日志,以满足不同的场景,内置的几个日志系统包括: Console,输出到控制台,用于调试,在产品环境可能会影响性能。Debug,输出到 System.Di…...

android13(T) 以太网设置工具类
13 版本的以太网设置和以前版本有所变动,在 AS 中就能直接调用对应 API 将 build.gradle 版本修改 compileSdkVersion 31, 即可直接调用 EthernetManager 相关, 设置静态等方法可以通过反射调用设置。 以下是核心设置静态和动态参数工具类,…...

电脑报错提示xinput1_3.dll缺失怎么办?xinput1_3.dll丢失的简单恢复方案
今天,我将为大家分享一个与我们日常工作息息相关的话题——xinput1_3.dll丢失的4种解决方法。在我们的日常工作和生活中,电脑出现问题是常有的事,而xinput1_3.dll丢失则是其中较为常见的一种问题。那么,什么是xinput1_3.dll?它为…...

unity 之参数类型之引用类型
文章目录 引用类型引用类型与值类型的差异 引用类型 在Unity中,引用类型是指那些在内存中存储对象引用的数据类型。以下是在Unity中常见的引用类型的介绍: 节点(GameObject): 在Unity中,游戏对象ÿ…...

SpringBoot自定义工具类—基于定时器完成文件清理功能
直接复制粘贴既可!! import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.io.File; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneOff…...

安卓设置混淆后,gson报错解决方法
一,设置开启混淆release {minifyEnabled truezipAlignEnabled trueshrinkResources trueproguardFiles getDefaultProguardFile(proguard-android-optimize.txt), proguard-rules.pro } 二,混淆的文件中,对gson相关类不进行混淆,否…...

WPF实战项目十四(API篇):登录注册接口
1、新建UserDto.cs public class UserDto : BaseDto{private string userName;/// <summary>/// 用户名/// </summary>public string UserName{get { return userName; }set { userName value;OnPropertyChanged(); }}private string account;/// <summary>…...

10个免费PPT下载资源网站分享
PPT超级市场https://pptsupermarket.com/ PPT超级市场是一个完全免费的PPT模板下载网站,不需要注册登录,点击下载就能直接使用。 叮当设计https://www.dingdangsheji.com/ 叮当设计是一个完全免费的PPT模板下载网站,每一套PPT的质量都很高。除…...

SpringCloud入门——微服务调用的方式 RestTemplate的使用 使用nacos的服务名初步(Ribbon负载均衡)
目录 引出微服务之间的调用几种调用方法spring提供的组件 RestTemplate的使用导入依赖生产者模块单个配置的情况多个配置的情况没加.yaml的报错【报错】两个同名配置【细节】 完整代码config配置主启动类controller层 消费者模块进行配置restTemplate配置类controller层 使用na…...

Python基础篇(16):python中__new__方法
一、__new__方法的定义 __new__() 方法是一种负责创建 类实例 的 静态方法 二、__new__方法的作用 在内存中为对象分配空间返回对象的引用 三、__new__方法的使用 创建对象时自动调用__new__方法,并且是在__init__初始化方法之前被调用Python解释器获得对象的引…...

linux并发服务器 —— 文件IO相关函数(三)
文件IO 以内存为主体,看待输入输出; 标准C库IO函数带有缓冲区,效率较高; 虚拟地址空间 虚拟地址空间是不存在的,一个应用程序运行期间对应一个虚拟地址空间; 虚拟地址空间的大小由CPU决定,位…...

matlab使用教程(27)—微分代数方程(DAE)求解
1.什么是微分代数方程? 微分代数方程是一类微分方程,其中一个或多个因变量导数未出现在方程中。方程中出现的未包含其导数的变量称为代数变量,代数变量的存在意味着您不能将这些方程记为显式形式 y ′ f t , y 。相反,您可以…...

vue3组合式api <script setup> props 父子组件的写法
父组件传入子组个的变量, 子组件是无法直接修改的, 只能通过 emit的方式, 让父组件修改, 之后子组件更新 <template><div class"parent">我是父组件<son :msg"msg" :obj"obj" chan…...

Compose - 自定义作用域限制函数
一、概念 在 Compose 中对于作用域的应用特别多。比如 weight 修饰符只能用在 RowScope 或者 ColumnScope 作用域中,item 组件只能用在 LazyListScope 作用域中。 标准库中的作用域函数如 apply()、let() 会以不同方式持有和返回上下文对象,调用它们时 L…...

【Flutter】Flutter 使用 photo_view 实现图片查看器
【Flutter】Flutter 使用 photo_view 实现图片查看器 文章目录 一、前言二、photo_view 简介三、安装与基本使用四、使用 PhotoViewGallery 展示多张图片五、完整示例六、总结 一、前言 大家好,我是小雨青年,今天我要给大家介绍一个在 Flutter 中非常实…...

电脑组装教程分享!
案例:如何自己组装电脑? 【看到身边的小伙伴组装一台自己的电脑,我也想试试。但是我对电脑并不是很熟悉,不太了解具体的电脑组装步骤,求一份详细的教程!】 电脑已经成为我们日常生活中不可或缺的一部分&a…...

【云原生之Docker实战】使用Docker部署flatnotes笔记工具
【云原生之Docker实战】使用Docker部署flatnotes笔记工具 一、flatnotes介绍1.1 flatnotes简介1.2 flatnotes特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载flatnotes…...

XSSchallenge1-20
test1 第一题直接在test插入XSS代码即可 test2 第二关对内容进行”“包裹 这里可以采用”>来绕过 test3 代码审计发现这里用了htmlspecialchars函数,这个函数对<>和’ “等进行了转义,这里可以用事件来绕过 test4 这里用了str_replace&a…...

centos 7的超详细安装教程
打开虚拟机,创建一个新电脑 我们选择经典,然后选择下一步 我们选择稍后安装,我们在后面进行改设备 因为centos系统是linux系统的一个版本,所有我们选择linux,版本选择centos 7 64位,然后就是点击下一步 这一…...

代码随想录算法训练营第五十二天 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组
代码随想录算法训练营第五十二天 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组 300.最长递增子序列674. 最长连续递增序列718. 最长重复子数组 300.最长递增子序列 题目链接 视频讲解 给你一个整数数组 nums ,找到其中最…...

计算机图形软件(三)6-6 小结
小结 这一章概括了图形软件系统的主要特点。某些软件系统,如 CAD 软件包和绘图程序,其为特定应用而设计。另外一些软件系统则提供可以在诸如 C的程序设计语言中使用的一个通用图形子程序库,用来为任何应用生成图片。 ISO和AN…...

Flink常用函数
1、比较函数 <> > > < < 注意:select nullnull; 返回为nullIS NULL 、 IS NOT NULL --非空判断value1 IS DISTINCT FROM value2、value1 IS NOT DISTINCT FROM value2、 --不同于value1 BETWEEN [ ASYMMETRIC | S OR 、AND、NOT boolean…...

stable diffusion实践操作-embedding(TEXTUAL INVERSION)
本文专门开一节写图生图相关的内容,在看之前,可以同步关注: stable diffusion实践操作 可以理解为提示词的集合,可以省略大量的提示词。后缀safetensors,大小几十kb 正文 1、功能 可以理解为提示词的集合࿰…...

代码随想录二刷day03
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣203. 移除链表元素二、力扣707. 设计链表三、力扣206. 反转链表 前言 一、力扣203. 移除链表元素 /*** Definition for singly-linked list.* public…...