MongoTemplate查询工具类,大家都来试试吧

NTC热敏电阻线性化全攻略:从硬件并联到软件查表拟合 温度传感器在嵌入式系统中的应用极为广泛,其中NTC热敏电阻凭借成本低、响应快、测温范围宽成为模拟温度采集的首选。然而,NTC的阻值随温度呈指数变化,导致ADC采集到的电压与温度并非线性关系,低温段灵敏、高温段平缓,直接映射会产生较大误差。针对这一痛点,工程上常采用硬件并联电阻法或软件线性化方案,后者又包含查表插值与多项式拟合两种主流路线。通过建立ADC码值与温度的对应关系,配合二分查找和线性插值,即可在低算力MCU上实现较高精度测量。在实际项目中,还需关注分压电阻匹配、自热效应、软件滤波及批量校准等细节。本 阅读详情

1 代码

1.1 查询条件构建基础类

设计用来支持流式查询,以及增强语义化的一些类

package xyz.yq56.mongo.entity.query;

import java.util.HashMap;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 精确查询基础类,理论上下面范围和排序也可以用这个代替,但是语义很差
 * @author yiqiang
 */
public class ChainMap extends HashMap<String, Object> {
    public static ChainMap build() {
        return new ChainMap();
    }

    public ChainMap add(String key, Object value) {
        this.put(key, value);
        return this;
    }

    @Override
    public String toString() {
        ObjectMapper mapper = new ObjectMapper();
        try {
            return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(this);
        } catch (JsonProcessingException e) {
            return "";
        }
    }
}


package xyz.yq56.mongo.entity.query;

import java.util.Arrays;
import java.util.HashMap;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 排序基础类
 * @author yi qiang
 * @date 2022/8/7 16:23
 */
public class ChainOrder extends HashMap<String, String> {
    public static final String DESC = "DESC";
    public static final String ASC = "ASC";

    public static ChainOrder build() {
        return new ChainOrder();
    }

    /**
     * 添加排序
     *
     * @param key   排序字段
     * @param value 顺序: asc or desc
     * @return 排序封装类
     */
    public ChainOrder add(String key, String value) {
        if (!Arrays.asList(DESC, ASC).contains(value.toUpperCase())) {
            throw new IllegalArgumentException();
        }
        this.put(key, value.toUpperCase());
        return this;
    }

    @Override
    public String toString() {
        ObjectMapper mapper = new ObjectMapper();
        try {
            return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(this);
        } catch (JsonProcessingException e) {
            return "";
        }
    }
}

package xyz.yq56.mongo.entity.query;

import java.util.HashMap;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 范围查询基础类
 * @author yi qiang
 * @date 2022/8/7 15:10
 */
public class ChainRange extends HashMap<String, ChainRange.Range> {

    public static ChainRange build() {
        return new ChainRange();
    }


    public ChainRange add(String key, Range value) {
        this.put(key, value);
        return this;
    }

    @Data
    @Accessors(chain = true)
    public static class Range {
        //左边是否是开区间,默认是闭区间
        private boolean leftOpen;
        //右边是否是开区间,默认是闭区间
        private boolean rightOpen;
        //左边值
        private Object left;
        //右边值
        private Object right;
    }

    @Override
    public String toString() {
        ObjectMapper mapper = new ObjectMapper();
        try {
            return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(this);
        } catch (JsonProcessingException e) {
            return "";
        }
    }
}


1.2 查询条件构建类MongoParam

设计出来其实主要功能就是build方法来构建Query对象,其内部封装了多条件判空,offset计算以及多条件排序等功能.理论上,只要创建好MongoParam,然后调用build方法即可得到想要的查询结果
另外也贴心的准备了buildForCount方法,用来给到count方法使用

package xyz.yq56.mongo.entity.query;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.springframework.beans.BeanUtils;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * @author yiqiang
 */
@Accessors(chain = true)
@Data
@SuppressWarnings("all")
public class MongoParam {

    /**
     * 相等的字段
     */
    ChainMap eqFields;
    /**
     * 范围查询字段
     */
    ChainRange rangeFields;
    /**
     * 排序字段
     */
    ChainOrder orderFields;
    /**
     * 偏移量
     */
    Long offset;
    /**
     * 页码
     */
    Long page;
    /**
     * 页面大小
     */
    Integer size;

    /**
     * 构建查询条件
     *
     * @return 返回MongoTemplate所需查询条件
     */
    public Query build() {
        Query query = new Query();
        query.addCriteria(createCriteria());
        withOrder(query);
        withPage(query);
        return query;
    }

    /**
     * 为计数构建Query,不需要排序和分页等字段逻辑
     * <br> 已浅拷贝对象,不会影响build()结果
     *
     * @return 查询对象
     */
    public Query buildForCount() {
        MongoParam params = new MongoParam();
        BeanUtils.copyProperties(this, params);
        params.orderFields = null;
        params.offset = null;
        params.page = null;
        params.size = null;
        return params.build();
    }

    /**
     * 仅仅只会给query添加分页相关属性,如skip和limit
     *
     * @param query 查询
     */
    public Query withPage(Query query) {
        if (query == null) {
            return null;
        }
        if (size != null) {
            query.limit(size);
            if (page != null) {
                query.skip((Math.max(page - 1, 0) * size));
            }
        }
        //优先offset
        if (offset != null) {
            query.skip(offset);
        }
        return query;
    }

    /**
     * 仅仅只会给query添加排序相关属性
     *
     * @param query 查询
     */
    public Query withOrder(Query query) {
        if (query == null) {
            return null;
        }
        //排序Map不为空,那么构建排序字段
        if (orderFields != null && orderFields.size() > 0) {
            List<Sort.Order> orderList = new ArrayList<>();
            //key是待排序字段;value是DESC或ASC字符串,大小写不敏感;
            orderFields.forEach((key, value) -> orderList.add(new Sort.Order(Sort.Direction.valueOf(value), key)));
            query.with(Sort.by(orderList));
        }
        return query;
    }

    /**
     * 获取到查询相关属性,包含精确查询和范围查询
     *
     * @return 基准
     */
    public Criteria createCriteria() {
        Criteria criteria = new Criteria();
        //精确匹配字段条件构建
        if (eqFields != null && eqFields.size() > 0) {
            eqFields.forEach((key, value) -> {
                if (value != null) {
                    if (value instanceof String && ((String) value).length() <= 0) {
                        return;
                    }
                    if (value instanceof Collection && ((Collection) value).isEmpty()) {
                        return;
                    }
                    if (value instanceof Map && ((Map) value).isEmpty()) {
                        return;
                    }
                    criteria.and(key).is(value);
                }
            });
        }

        //范围查询
        if (rangeFields != null && rangeFields.size() > 0) {
            rangeFields.forEach((key, value) -> {
                Criteria keyCriteria = criteria.and(key);
                Criteria leftCriteria = leftCriteria(keyCriteria, value);
                //如果左边条件不存在,那就直接检查右边条件
                if (leftCriteria != null) {
                    rightCriteria(leftCriteria, value);
                } else {
                    rightCriteria(keyCriteria, value);
                }
            });
        }
        return criteria;
    }

    private Criteria leftCriteria(Criteria criteria, ChainRange.Range range) {
        if (range.getLeft() != null) {
            if (range.isLeftOpen()) {
                return criteria.gt(range.getLeft());
            } else {
                return criteria.gte(range.getLeft());
            }
        }
        return null;
    }

    private Criteria rightCriteria(Criteria criteria, ChainRange.Range range) {
        if (range.getRight() != null) {
            if (range.isRightOpen()) {
                return criteria.lt(range.getRight());
            } else {
                return criteria.lte(range.getRight());
            }
        }
        return null;
    }

    @Override
    public String toString() {
        ObjectMapper mapper = new ObjectMapper();
        try {
            return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(this);
        } catch (JsonProcessingException e) {
            return "";
        }
    }
}

1.3 查询工具类

package xyz.yq56.mongo.util;

import java.util.List;

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;

import xyz.yq56.mongo.entity.query.MongoParam;

/**
 * @author yi qiang
 * @date 2022/8/7 4:43
 */
public class MongoUtil {

    private MongoUtil() {
    }


    public static <T> List<T> list(MongoTemplate mongoTemplate, MongoParam mongoParam, Class<T> zClass) {
        return mongoTemplate.find(mongoParam.build(), zClass);
    }
    
}

2 使用示例

2.1 测试代码

@Repository
@Slf4j
public class RoomBonusDailyDataDaoMongoImpl {

    @Autowired
    MongoTemplate mongoTemplate;

    public List<RoomBonusDailyData> test() {
        Date left = new Date(System.currentTimeMillis() - (60 * 1000 * 60 * 24) * 10);

        MongoParam mongoParam = new MongoParam()
                .setEqFields(ChainMap.build()
                        .add("uid", "752")
                        .add("roomId", "2")
                )
                .setRangeFields(ChainRange.build()
                        .add("updateTime", new ChainRange.Range().setLeft(left))
                        .add("type", new ChainRange.Range().setLeft(1).setRight(2))
                )
                .setOrderFields(ChainOrder.build()
                        .add("updateTime", "ASC")
                        .add("uid", "DESC"))
                .setPage(1L)
                .setSize(10);

        System.out.println(mongoParam);
       
        return MongoUtil.list(mongoTemplate, mongoParam, RoomBonusDailyData.class);
    }
}

2.2 输出结果

从发送的command可以看到所有的条件都已生效

{
  "eqFields" : {
    "uid" : "752",
    "roomId" : "2"
  },
  "rangeFields" : {
    "updateTime" : {
      "leftOpen" : false,
      "rightOpen" : false,
      "left" : 1659021724377,
      "right" : null
    },
    "type" : {
      "leftOpen" : false,
      "rightOpen" : false,
      "left" : 1,
      "right" : 2
    }
  },
  "orderFields" : {
    "uid" : "DESC",
    "updateTime" : "ASC"
  },
  "offset" : null,
  "page" : 1,
  "size" : 10
}
2022-08-07 23:22:04.440 DEBUG 13152 --- [           main] o.s.data.mongodb.core.MongoTemplate      : find using query: { "uid" : "752", "roomId" : "2", "updateTime" : { "$gte" : { "$date" : 1659021724377}}, "type" : { "$gte" : 1, "$lte" : 2}} fields: Document{{}} for class: class xyz.yq56.mongo.entity.RoomBonusDailyData in collection: roomBonusDailyData
2022-08-07 23:22:04.466  INFO 13152 --- [           main] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:2, serverValue:269}] to localhost:27017
2022-08-07 23:22:04.478 DEBUG 13152 --- [           main] org.mongodb.driver.protocol.command      : Sending command '{"find": "roomBonusDailyData", "filter": {"uid": "752", "roomId": "2", "updateTime": {"$gte": {"$date": "2022-07-28T15:22:04.377Z"}}, "type": {"$gte": 1, "$lte": 2}}, "sort": {"uid": -1, "updateTime": 1}, "limit": 10, "$db": "test"}' with request id 6 to database test on connection [connectionId{localValue:2, serverValue:269}] to server localhost:27017
2022-08-07 23:22:04.478 DEBUG 13152 --- [           main] org.mongodb.driver.protocol.command      : Execution of command with request id 6 completed successfully in 4.66 ms on connection [connectionId{localValue:2, serverValue:269}] to server localhost:27017
[RoomBonusDailyData(id=2-2-20220801, type=2, roomId=2, uid=752, region=6, value=529, weekStartDate=20220801, updateTime=Mon Aug 01 22:47:18 CST 2022)]
Java中运用MongoTemplate对MongoDB实现增删改查以及聚合查询的使用 在Java中除了使用源生的方式操作MongoDB,还可以使用MongoTemplate封装类。 首先pom中引入依赖 <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifac... 阅读详情

相关推荐

Springboot 整合mongodb以及mongo数据操作工具类代码实现

pom文件里添加mongodb依赖 <!-- mongodb --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>

洛阳泰山的博客 2681

Java使用MongoTemplate实现多条件、模糊查询、排序、范围、分页查询

MongoTemplate实现复杂条件查询

Java_Rookie_Xiao的博客 9988

SpringBoot 基于 MongoTemplate 的工具类

MongoDB基于分布式文件存储的数据库。由C++语言编写。MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

专注基础架构领域 1168

mongoDB使用工具类

【代码】mongoDB使用工具类。

wt5264的博客 470

【数据库】Java 集成mongodb— MongoTemplate 详解

`MongoTemplate` 是 Spring Data MongoDB 提供的核心类,用于简化与 MongoDB 数据库的交互。它封装了许多常见的数据库操作,使开发者能够轻松执行 CRUD(创建、读取、更新、删除)操作,处理复杂查询和聚合等。本文将详细介绍 `MongoTemplate` 的功能、使用方法、配置步骤以及一些实际示例。

颜淡慕潇 1万+

mongoTemplate工具类Dao层方法封装.zip

该资源内容主要包含:两个版本常用mongoTemplate操作数据库集合语句的整理

spring实现 mongodb 关联查询单条记录的返回值为ArrayList的处理优化 $toInt $arrayElemAt

1背景问题描述 如果觉得有用记得给个关注 import org.bson.Document; 工作中使用关联查询两个表并返回Document map给前端进行数据展示发现数据结构有问题好多字段为ArrayList类型 相关截图及语句如下: 优化前语句 去除部分敏感字段 MatchOperation matchOperation = Aggregation.match(Criteria.where("username").is(username)); LookupOperati

lMasterSparkl的博客 906

MongoUtils工具类实现

封装mong关联查询api接口,如addBatch()、delete()、exists()、lookUp()等接口 public void delete(Query query , Object obj , String collectionName){ mongoTemplate.remove(query, obj .getClass(), collectionName); } public boolean update(Query query , Update update , Object obj , String collectionName){ UpdateResult result = mongoTemplate.updateMulti(query, update, obj.getClass(), collectionName); return result.wasAcknowledged(); } public List<?> getAllByCollectionName(

mongo的upsert(spring的mongo template)

mongo的api在某些方面表现的异常优秀,这几天体会了一下mongo的upsert方法。 我的目的是想在某个项号下记录每天的评论,并且能够查到某段日期间按时间倒叙排列的评论。我的设计是这样: 1 类设计 首先是记录每天的评论汇总@Document(collection="comments") public class Comments { @Id private String id

u014016716的专栏 2万+

【高级-RAG-优化方法】

本文介绍了两种优化RAG(检索增强生成)系统的高级方法。第一部分介绍KnowFlow项目,它采用父子分块技术,将文档分为父分块(800-1500字符)和子分块(200-400字符),通过精确匹配子分块再返回父分块内容来保证搜索精确性和上下文完整性。第二部分探讨Milvus的多种增强技术,包括查询增强(如假设问题生成、回溯提示)、索引增强(自动合并块、分层索引)、检索器增强(句子窗口检索、元数据过滤)、生成器增强(提示压缩、块排序)以及管道增强(自我反省、代理查询路由)。这些方法共同提升了RAG系统的检索效率

weixin_48585108的博客 960

STM32F407步进电机控制及DM542驱动器使用

基于DM542驱动器的步进电机简单控制

qq_43868701的博客 1万+

医院信息化与智能化系统(12)

如果你想通过文字描述或代码画流程图,可以试试PlantUML,告诉GPT你的文件结构,让他给你对应的代码。

thm19990903的博客 397

DIY天文摄影:如何用NMP溶剂安全去除佳能CMOS传感器的拜耳滤镜(附详细步骤)

本文为天文摄影爱好者提供了一份详尽的DIY指南,介绍如何使用NMP溶剂安全去除佳能CMOS传感器的拜耳滤镜,将其改造为高灵敏度单色相机。文章深入剖析了NMP溶剂的作用原理与关键风险,并系统性地拆解了从材料准备、分步操作到后期验证的完整实践流程,旨在帮助具备动手能力的爱好者实现深空天体摄影的进阶目标。

w3x4y的博客 309

SpringBoot集成MongoDB做日志存储

前言 今天翻出了以前的一个项目,发现对于日志的存储,是存储在数据库中的,将对应的入参、出参、请求方式、请求路径等信息存储在数据表中,想到这样的存储如果时间久了该数据表的数据量会很大,想到用MongoDB试试做日志的存储,这样将日志存储在MongoDB数据库,查询对应的请求时也可以很快的查询出来。 思路如下 既然要做日志的存储,那么就需要用AOP来实现,这样我们只需要配置一个配置类,就可以将请求发送...

qq_40126996的博客 2938

kubedns-coredns部署pod出现not ready问题

文章目录遇到的问题1、发现问题2、排查问题3、解决方法 coredns的实例health_check不通过的问题,排查和解决方法 遇到的问题 1、发现问题 pod启动但是未ready 查看是readiness失败 使用对应的URL进行curl,发现真的返回503 2、排查问题 查看错误日志,发现一堆这个错误"waiting on : kubernetes" 网上相关的问题解答 这个跟测试场景不一样,这个案例是开了防火墙,可以确认我这个案例的机器没有开防火墙,但它提醒了一点,coredns是需要访问ap

u012533481的博客 2844

Matlab实战:用递归最小二乘法(RLS)搞定动态系统参数辨识(附完整代码)

本文通过Matlab实战,详细介绍了如何利用递归最小二乘法(RLS)进行动态系统参数辨识。文章从理论优势切入,提供了完整的仿真数据生成、RLS算法核心实现代码,并对参数收敛过程、预测误差及不同遗忘因子的影响进行了可视化分析与性能评估,为工程实践提供了清晰的指南。

weixin_29035405的博客 504

MongoDB学习笔记(十二)——删除文档

有插入文档,就有需求要删除文档。 MongoDB shell shell中删除文档很简单,其集合提供了一个remove()、deleteOne()、deleteMany()、findOneAndDelete()四个方法用于删除文档。 我们首先看一下前三个方法的定义。 db.collection.remove()方法有两种语法: 1.可以带一个查询文档和一个可选的justOne布尔值: ...

落尘 1万+

高级数据库--作业及答案

中科大金培权老师的高级数据库课程作业及答案

一杯水果茶!足矣~ 1660

MongoDB在java代码中的增删改查

MongoDB基本使用,增删改查已经分页查询

qq_42203603的博客 623

YOLOv8 骨骼结构识别详细说明

YOLOv8骨骼结构识别是一种基于深度学习技术的医学影像分析方法,主要用于X光、CT等影像中的骨骼定位与识别。该系统具有多骨骼同步识别能力,可应用于手部、脊柱、骨盆等不同部位,并能精确定位骨骼关键点。技术实现包括数据预处理、模型训练、推理检测、关键点分析和批量处理五个核心模块,支持骨折检测、骨龄评估等临床应用。该系统需注意医学合规性,要求高质量标注数据,并针对骨骼影像特点进行特征工程优化,同时考虑不同设备的部署需求。

u010117029的博客 333

【实战项目开发技术分享】如何设置机器人禁行区/虚拟墙

在现代机器人技术的日益发展中,路径规划是使机器人在复杂环境中安全、高效移动的关键部分。其中一个重要的问题是如何划定机器人的禁行区,以确保机器人不会进入危险区域或无法到达的地方。在本文中,我们将探讨一些关键策略,帮助机器人算法工程师更好地划定禁行区。代价地图可以通过多层叠加来实现,一般包括以下几个层级:静态地图层(Static Map Layer):由SLAM(Simultaneous Localization and Mapping)构建的静态地图。该层包含了环境中固定不变的地物信息,如墙壁、家具等。

xiewf的博客 1万+

SpringBoot整合MongoDB(MongoRepository+MongoTemplate)

说 明: SpringBoot 对mongodb操作存在两种操作方式,一种是MongoRepository,一种是MongoTemplate。 准备 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifa

houxian1103的博客 1091

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

MongoDB基础学习(五)之在Springboot项目使用MongoTemplate进行操作

Springboot项目使用MongoTemplate进行操作

weixin_53998054的博客 1576

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SpringBoot之MongoTemplate的各种条件查询

SpringBoot之MongoTemplate的各种条件查询 /** * 指定field查询 */ public void specialFieldQuery() { Query query = new Query(Criteria.where("user").is("用户名blog")); // 查询一条满足条件的数据 Map result = mongoTemplate.findOne(query, Map.class

hins 9447

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Mongodb工具类(crud)

mongodb-crud

感谢阅读 1014

java操作MongoDB工具类分享

最近做了个用MongoDB存储的项目,由于MongoDB对开发人员不开放,由DBA统一管理。因此,自己抽时间写了个MongoDB的查询机。便于查询项目中的数据,方便维护和分析问题。总结了一些java操作MongoDB的方法。本文没有使用spring-data来操作MongoDB。而是直接使用MongoDB for java的原始API。现在介绍一下工具类。 1.准备工作 MongoDB的安装,...

淘淘联盟 9263
上一篇: 百万数据导出Excel工具类,欢迎指正
下一篇: 达到阈值自动执行的工具类
一步一结
博客等级 码龄7年 50粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值