国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MongoDB - 構(gòu)造復(fù)雜查詢條件執(zhí)行查詢

這篇具有很好參考價(jià)值的文章主要介紹了MongoDB - 構(gòu)造復(fù)雜查詢條件執(zhí)行查詢。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

/**
 * 查詢白名單詳情
 *
 * @param offset        第幾頁(yè)開(kāi)始
 * @param limit         每頁(yè)顯示的最大值
 * @param keyword       模糊搜索值
 * @param order         排序方式(升序/降序)
 * @param sortKey       排序的字段
 * @param threatSubType 告警類型
 * @return 白名單實(shí)體列表
 */
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
) {
    // 開(kāi)始構(gòu)造查詢條件
    Query query = new Query();
    // 1. 構(gòu)造 keyword 的查詢條件
    if (!StringUtils.isEmpty(keyword)) {
        query.addCriteria(dealKeyword(keyword));
    }
    // 2. 構(gòu)造排序規(guī)則,默認(rèn)是降序排序 
    Sort.Order orderSort = Sort.Order.desc(sortKey);
    if (Objects.equals(order, ASC)) {
        orderSort = Sort.Order.asc(sortKey);
    }
    // 3. 構(gòu)造 threatSubType 的查詢條件
    getThreatSubTypeFilter(threatSubType, query);
    // 4. 對(duì)status按照指定排序規(guī)則排序
    query.with(Sort.by(Sort.Order.desc("status"), orderSort));
    // 5. 分頁(yè)查詢
    query.skip((long) (offset - 1) * limit).limit(limit);
    
    // 執(zhí)行查詢
    return incidentMongoTemplate.find(query, AlertWhiteEntity.class);
}

1. 構(gòu)造 keyword 的查詢條件

private CriteriaDefinition dealKeyword(String keyword) {
    // Java的正則表達(dá)式庫(kù)創(chuàng)建了一個(gè)正則表達(dá)式模式對(duì)象:匹配任意位置包含指定關(guān)鍵字的字符串,并且不區(qū)分大小寫。
    Pattern pattern = Pattern.compile("^.*" + keyword + ".*$", Pattern.CASE_INSENSITIVE);
    Criteria criteria = new Criteria();
    Criteria[] criteriaArray = null;
    String fullIp = "";
    // ruleList.ruleList 中存在一個(gè)元素,該元素滿足以下條件:type字段等于"srcIp"或"dstIp",value字段匹配給定的正則表達(dá)式pattern
    // creator 字段匹配給定的正則表達(dá)式pattern
    // name 字段匹配給定的正則表達(dá)式pattern
    // ruleList.ipRange 中存在一個(gè)元素,該元素的value滿足以下條件: startIp字段小于等于給定的fullIp,endIp字段大于等于給定的fullIp
    if (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)))

                )
        };
    // 查詢r(jià)uleList.ruleList中滿足以下條件的元素:type字段等于"srcIp"或者"type"字段等于"dstIp",value字段匹配正則表達(dá)式pattern
    // 查詢creator字段匹配正則表達(dá)式pattern的文檔
    // 查詢name字段匹配正則表達(dá)式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. 構(gòu)造 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. 相應(yīng)的實(shí)體類

@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 = "攻擊小類數(shù)量", example = "{[\"label\":\"aaaa\",\"value\":\"1_2_3\"]}")
    private List<WhiteScreenEntity> threatSubType;

    @Field("threatSubTypeView")
    @ApiModelProperty(value = "攻擊小類展示數(shù)組", example = "[\"aaa\"]")
    private List<String> threatSubTypeView;

    @Field("threatSubTypeId")
    @ApiModelProperty(value = "攻擊小類ID數(shù)組", example = "[\"1_2_3\"]")
    private List<String> threatSubTypeId;

    @Field("hostIp")
    @ApiModelProperty(value = "生效主機(jī)", example = "1.1.1.1")
    private List<String> hostIp;

    @Field("isHostAll")
    @ApiModelProperty(value = "是否勾選全部")
    private Boolean isHostAll;

    @Field("repeatMd5")
    @ApiModelProperty(value = "用于判斷是否重復(fù)md5")
    private String repeatMd5;

    @Field("status")
    @ApiModelProperty(value = "狀態(tài)", notes = "啟用enable | 禁用disable")
    private String status;

    @Field("name")
    @ApiModelProperty(value = "規(guī)則名稱")
    private String name;

    @Field("isUnlimited")
    @ApiModelProperty(value = "是否永久生效", notes = "永久生效1 | 自定義0")
    private Integer isUnlimited;

    @Field("sort_status")
    @ApiModelProperty(value = "分類狀態(tài)", notes = "status是enable時(shí)1 | status是disable時(shí)0")
    private Integer sortStatus;

    @Field("reason")
    @ApiModelProperty(value = "備注")
    private String reason;

    @Field("ruleList")
    @ApiModelProperty(value = "規(guī)則列表")
    private RuleEntity ruleList;

    @Field("creator")
    @ApiModelProperty(value = "創(chuàng)建人")
    private String creator;

    @Field("creatorId")
    @ApiModelProperty(value = "創(chuàng)建人Id")
    private String creatorId;

    @Field("startTime")
    @ApiModelProperty(value = "開(kāi)始時(shí)間")
    private Long startTime;

    @Field("endTime")
    @ApiModelProperty(value = "結(jié)束時(shí)間")
    private Long endTime;

    @Field("createTime")
    @ApiModelProperty(value = "創(chuàng)建時(shí)間")
    private long createTime;

    @Field("updateTime")
    @ApiModelProperty(value = "更新時(shí)間")
    private long updateTime;

    @Field("deleted")
    @ApiModelProperty(value = "是否刪除", notes = "否0 | 是1")
    private boolean deleted;
}
@Data
public class RuleEntity {

    @ApiModelProperty(value = "規(guī)則列表")
    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 = "匹配規(guī)則")
public class RuleInfoEntity<T> implements ValidateAble {

    @ApiModelProperty(value = "匹配字段", required = true, example = "srcIp")
    private String type;

    /***
     * 該值用于處理view進(jìn)行轉(zhuǎn)換,不接收來(lái)自調(diào)用者
     */
    @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 = "開(kāi)始IP")
    private String startIp;

    @ApiModelProperty(value = "結(jié)束ip")
    private String endIp;

}

文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-681862.html

到了這里,關(guān)于MongoDB - 構(gòu)造復(fù)雜查詢條件執(zhí)行查詢的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包