SpringBoot集成Mongodb文档数据库

springboot,mongodb · 浏览次数 : 0

小编点评

**添加Maven依赖** 在项目的pom.xml文件中添加Spring Boot的MongoDB依赖: ```xml org.springframework.boot spring-boot-starter-data-mongodb ``` **配置MongoDB连接信息** 在application.properties或application.yml文件中配置MongoDB连接信息: ```properties # application.properties spring.data.mongodb.host=10.30.29.246 spring.data.mongodb.port=16030 spring.data.mongodb.authenticationDatabase=admin spring.data.mongodb.database=nrdt spring.data.mongodb.username=admin spring.data.mongodb.password=QAZqaz@123321 # application.yml spring: data: mongodb: host: 10.30.29.246 port: 16030 authenticationDatabase: admin database: nrdt username: admin password: QAZqaz@123321 ``` **实现常用功能** 以下是一个简化的代码示例,实现了集合的创建、删除、清空、修改字段名称、删除指定列、批量新增行数据、批量插入、修改行数据、抽样查询、分页查询表数据、根据条件查询数据量和分页查询集合的数据等功能。 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.update.Update; import org.springframework.stereotype.Service; import org.springframework.util.Assert; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @Service public class MongodbService { @Autowired private MongoTemplate mongoTemplate; // ... 其他方法 public void addCollection(String collName) { Assert.notEmpty(collName, "collName"); booleanbol = mongoTemplate.collectionExists(collName); if (!bol) { mongoTemplate.createCollection(collName); } } public void dropCollection(String collName) { Assert.notEmpty(collName, "collName"); booleanbol = mongoTemplate.collectionExists(collName); if (bol) { mongoTemplate.dropCollection(collName); } } public void clearCollection(String collName) { Assert.notEmpty(collName, "collName"); booleanbol = mongoTemplate.collectionExists(collName); if (bol) { mongoTemplate.remove(new Query(), collName); } } public boolean editField(String collName, String oldName, String newName) { Assert.notEmpty(collName, "collName"); Assert.notEmpty(oldName, "oldName"); Assert.notEmpty(newName, "newName"); Query query = new Query(); Update update = new Update(); update.rename(oldName, newName); UpdateResult result = mongoTemplate.updateMulti(query, update, collName); return result.wasAcknowledged(); } public boolean dropField(String collName, String field) { Assert.notEmpty(collName, "collName"); Assert.notEmpty(field, "field"); Query query = new Query(); Update update = new Update(); update.unset(field); UpdateResult result = mongoTemplate.updateMulti(query, update, collName); return result.wasAcknowledged(); } public boolean addField(String collName, String field) { Assert.notEmpty(collName, "collName"); Assert.notEmpty(field, "field"); Query query = new Query(); query.fields().include(field); booleanbol = mongoTemplate.exists(query, collName); if(!bol){ Update update = new Update(); update.set(field, 0.00d); UpdateResult result = mongoTemplate.updateMulti(query, update, collName); return result.wasAcknowledged(); } return false; } public boolean addFields(String collName, List fields) { Assert.notEmpty(collName, "collName"); Assert.notNull(fields, "fields"); Update update = new Update(); boolean status = false; for (String field : fields) { Query query = new Query(); query.fields().include(field); booleanbol = mongoTemplate.exists(query, collName); if(!bol){ update.set(field, 0.00d); status = true; } } if(status){ UpdateResult result = mongoTemplate.updateMulti(new Query(), update, collName); return result.wasAcknowledged(); } else { return false; } } public void insert(String collName, JSONArray jsonArray) { Assert.notEmpty(collName, "collName"); Assert.notNull(jsonArray, "jsonArray"); mongoTemplate.insert(jsonArray, collName); } public void insert(String collName, List list) { Assert.notEmpty(collName, "collName"); Assert.notNull(list, "list"); mongoTemplate.insert(list, collName); } public void edit(String collName, JSONObject jsonObject) { Assert.notEmpty(collName, "collName"); Assert.notNull(jsonObject, "jsonObject"); mongoTemplate.save(jsonObject, collName); } public boolean remove(String collName, String[] ids) { Assert.notEmpty(collName, "collName"); Assert.notNull(ids, "ids"); Query query = new Query(Criteria.where(MongoConstants.ID_COLUMN).in(ids)); DeleteResult result = mongoTemplate.remove(query, collName); return result.wasAcknowledged(); } public List getListSample(SearchVo search){ // ... 实现抽样查询逻辑 } public Map getTimes(String collName){ // ... 实现查询样本时间的上下限逻辑 } public TableDataInfo getPage(SearchInput search) { // ... 实现分页查询表数据的逻辑 } public long getCount(SearchInput search) { // ... 实现根据条件查询数据量的逻辑 } public List getListDoc(SearchInput search) { // ... 实现分页查询集合数据的逻辑 } public JSONObject getOne(String collName){ // ... 实现随机查询一条数据的逻辑 } public Query getQuery(SearchInput search) { // ... 实现根据条件查询数据的逻辑 } public void copyCollection(SearchCopy search) { // ... 实现根据条件复制一个新的集合数据的逻辑 } } ``` 注意:以上代码仅作为示例,实际开发中可能需要根据具体需求进行调整和完善。

正文

添加Maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

配置Mongodb连接信息

spring:
  data:
    mongodb:
      host: 10.30.29.246
      port: 16030
      authenticationDatabase: admin # 登录用户的认证库
      database: nrdt
      username: admin
      password: QAZqaz@123321

通用服务(动态集合数据)

以下代码实现主要针对集合名称和字段都是未知的情况

@Slf4j
@Component
public class MongodbService {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 新增集合(表)
     *
     * @param collName
     */
    public void addCollection(String collName) {
        Assert.notEmpty(collName, "collName");
        boolean bol = mongoTemplate.collectionExists(collName);
        if (!bol) {
            mongoTemplate.createCollection(collName);
        }
    }

    /**
     * 删除集合(表)
     *
     * @param collName
     */
    public void dropCollection(String collName) {
        Assert.notEmpty(collName, "collName");
        boolean bol = mongoTemplate.collectionExists(collName);
        if (bol) {
            mongoTemplate.dropCollection(collName);
        }
    }

    /**
     * 清空集合数据
     *
     * @param collName
     */
    public void clearCollection(String collName) {
        Assert.notEmpty(collName, "collName");
        boolean bol = mongoTemplate.collectionExists(collName);
        if (bol) {
            mongoTemplate.remove(new Query(), collName);
        }
    }

    /**
     * 修改字段名称
     *
     * @param collName
     * @param oldName
     * @param newName
     * @return
     */
    public boolean editField(String collName, String oldName, String newName) {
        Assert.notEmpty(collName, "collName");
        Assert.notEmpty(oldName, "oldName");
        Assert.notEmpty(newName, "newName");
        Query query = new Query();
        Update update = new Update();
        update.rename(oldName, newName);
        UpdateResult result = mongoTemplate.updateMulti(query, update, collName);
        return result.wasAcknowledged();
    }

    /**
     * 删除指定列
     *
     * @param collName
     * @param field
     */
    public boolean dropField(String collName, String field) {
        Assert.notEmpty(collName, "collName");
        Assert.notEmpty(field, "field");
        Query query = new Query();
        Update update = new Update();
        update.unset(field);
        UpdateResult result = mongoTemplate.updateMulti(query, update, collName);
        return result.wasAcknowledged();
    }

    /**
     * 新增字段
     *
     * @param collName
     * @param field
     * @return
     */
    public boolean addField(String collName, String field) {
        Assert.notEmpty(collName, "collName");
        Assert.notEmpty(field, "field");
        Query query = new Query();
        query.fields().include(field);
        boolean bol = mongoTemplate.exists(query, collName);
        if(!bol){
            Update update = new Update();
            update.set(field, 0.00d);
            UpdateResult result = mongoTemplate.updateMulti(query, update, collName);
            return result.wasAcknowledged();
        }
        return false;
    }

    /**
     * 新增多个字段
     *
     * @param collName
     * @param fields
     * @return
     */
    public boolean addFields(String collName, List<String> fields) {
        Assert.notEmpty(collName, "collName");
        Assert.notNull(fields, "fields");
        Update update = new Update();
        boolean status = false;
        for (String field : fields) {
            Query query = new Query();
            query.fields().include(field);
            boolean bol = mongoTemplate.exists(query, collName);
            if(!bol){
                update.set(field, 0.00d);
                status = true;
            }
        }
        if(status){
            UpdateResult result = mongoTemplate.updateMulti(new Query(), update, collName);
            return result.wasAcknowledged();
        } else {
            return false;
        }
    }

    /**
     * 批量新增行数据
     *
     * @param collName
     * @param jsonArray
     */
    public void insert(String collName, JSONArray jsonArray) {
        Assert.notEmpty(collName, "collName");
        Assert.notNull(jsonArray, "jsonArray");
        mongoTemplate.insert(jsonArray, collName);
    }

    /**
     * 批量插入
     * insert: 可以一次性插入一整个列表,不允许插入已存在的主键
     * save:   需要遍历列表,进行一条一条的数据插入,主键存在则是修改
     * @param collName
     * @param list
     */
    public void insert(String collName, List<Document> list) {
        Assert.notEmpty(collName, "collName");
        Assert.notNull(list, "list");
        mongoTemplate.insert(list, collName);
    }

    /**
     * 修改行数据
     *
     * @param collName
     */
    public void edit(String collName, JSONObject jsonObject) {
        Assert.notEmpty(collName, "collName");
        Assert.notNull(jsonObject, "jsonObject");
        mongoTemplate.save(jsonObject, collName);
    }

    /**
     * 删除行数据
     *
     * @param collName
     */
    public boolean remove(String collName, String[] ids) {
        Assert.notEmpty(collName, "collName");
        Assert.notNull(ids, "ids");
        Query query = new Query(Criteria.where(MongoConstants.ID_COLUMN).in(ids));
        DeleteResult result = mongoTemplate.remove(query, collName);
        return result.wasAcknowledged();
    }

    /**
     * 抽样查询
     * @param search
     * @return
     */
    public List<Document> getListSample(SearchVo search){
        List<AggregationOperation> list = new ArrayList<>();
        list.add(Aggregation.sample(search.getSampleSize()));
        if(StrUtil.isNotEmpty(search.getColumns())){
            list.add(Aggregation.project(search.getColumns().split(",")));
        }
        Aggregation aggregation = Aggregation.newAggregation(list);
        return mongoTemplate.aggregate(aggregation, search.getCollName(), Document.class).getMappedResults();
    }

    /**
     * 查询样本时间的上下限
     * @param collName
     * @return
     */
    public Map<String, Object> getTimes(String collName){
        long startTime = System.currentTimeMillis();
        Map<String, Object> map = new HashMap<>();
        Assert.notEmpty(collName, "collName");
        List<AggregationOperation> list = new ArrayList<>();
        list.add(Aggregation.project(MongoConstants.TIME_COLUMN));
        list.add(Aggregation.group().min(MongoConstants.TIME_COLUMN).as("minTime").max(MongoConstants.TIME_COLUMN).as("maxTime"));
        Aggregation aggregation = Aggregation.newAggregation(list);
        Document doc = mongoTemplate.aggregate(aggregation, collName, Document.class).getRawResults();
        if(doc != null){
            if(Convert.toInt(doc.get("ok")) == 1){
                List<Document> results =  doc.get("results", List.class);
                if(results != null && results.size() > 0){
                    Document obj = results.get(0);
                    if(obj != null){
                        map.put("minTime", obj.getLong("minTime"));
                        map.put("maxTime", obj.getLong("maxTime"));
                    }
                }
            }
        }
        if(CollUtil.isEmpty(map)){
            map.put("minTime", null);
            map.put("maxTime", null);
        }
        log.info("查询样本上下限时间,耗时:{}秒", (System.currentTimeMillis() - startTime)/1000);
        return map;
    }
    /**
     * 分页查询表数据
     *
     * @param search
     * @return
     */
    public TableDataInfo getPage(SearchInput search) {
        List<JSONObject> list = new ArrayList<>();
        Query query = getQuery(search);
        long count = mongoTemplate.count(query, search.getCollName());
        if (count > 0L) {
            if (StrUtil.isEmpty(search.getSort())) {
                // 默认根据时间排序
                search.setSort(MongoConstants.TIME_COLUMN);
            }
            // 分页:跳过前skip个文档,返回接下来的pageSize个文档
            int skip = (search.getPageNum() - 1) * search.getPageSize();
            query = query.with(Sort.by(search.getSort()).ascending()).skip(skip).limit(search.getPageSize());
            list = mongoTemplate.find(query, JSONObject.class, search.getCollName());
        }
        TableDataInfo rspData = new TableDataInfo();
        rspData.setCode(HttpStatus.SUCCESS);
        rspData.setRows(list);
        rspData.setMsg("查询成功");
        rspData.setTotal(count);
        return rspData;
    }

    /**
     * 根据条件查询数据量
     *
     * @param search
     * @return
     */
    public long getCount(SearchInput search) {
        Query query = getQuery(search);
        return mongoTemplate.count(query, search.getCollName());
    }

    /**
     * 分页查询集合的数据
     *
     * @param search
     * @return
     */
    public List<Document> getListDoc(SearchInput search) {
        Query query = getQuery(search);
        if (StrUtil.isNotEmpty(search.getSort())) {
            query = query.with(Sort.by(search.getSort()).ascending());
        }
        int skip = (search.getPageNum() - 1) * search.getPageSize();
        query = query.skip(skip).limit(search.getPageSize());
        return mongoTemplate.find(query, Document.class , search.getCollName());
    }

    /**
     * 随机查询一条数据
     * @param collName
     * @return
     */
    public JSONObject getOne(String collName){
        Query query = new Query();
        query = query.limit(1);
        return mongoTemplate.findOne(query, JSONObject.class, collName);
    }

    public Query getQuery(SearchInput search) {
        Criteria criteria = new Criteria();
        List<Criteria> criteriaList = new ArrayList<>();
        if (StrUtil.isNotEmpty(search.getBeginTime())) {
            criteriaList.add(Criteria.where(MongoConstants.TIME_COLUMN).gte(Convert.toLong(search.getBeginTime())));
        }
        if (StrUtil.isNotEmpty(search.getEndTime())) {
            criteriaList.add(Criteria.where(MongoConstants.TIME_COLUMN).lte(Convert.toLong(search.getEndTime())));
        }
        if (criteriaList.size() > 0) {
            criteria.andOperator(criteriaList);
        }
        Query query = new Query(criteria);
        if (StrUtil.isNotEmpty(search.getColumns())) {
            query.fields().include(search.getColumns().split(","));
        }
        if(StrUtil.isNotEmpty(search.getExclude())){
            query.fields().exclude(search.getExclude().split(","));
        }
        return query;
    }

    /**
     * 根据条件复制一个新的集合数据
     * @param search
     */
    // @Async("threadPoolTaskExecutor")
    public void copyCollection(SearchCopy search) {
        long startTime = System.currentTimeMillis();
        log.info("开始把集合[{}]结果输出到另一个集合[{}]...", search.getCollName(), search.getNewId());
        clearCollection(search.getNewId());
        List<AggregationOperation> list = new ArrayList<>();
        if(StrUtil.isNotEmpty(search.getColumns())){
            list.add(Aggregation.project(search.getColumns().split(",")));
        }
        if(StrUtil.isNotEmpty(search.getBeginTime())){
            list.add(Aggregation.match(new Criteria(MongoConstants.TIME_COLUMN).gte(Convert.toLong(search.getBeginTime()))));
        }
        if(StrUtil.isNotEmpty(search.getEndTime())){
            list.add(Aggregation.match(new Criteria(MongoConstants.TIME_COLUMN).lte(Convert.toLong(search.getEndTime()))));
        }
        list.add(Aggregation.out(search.getNewId()));
        Aggregation aggregation = Aggregation.newAggregation(list);
        mongoTemplate.aggregateStream(aggregation, search.getCollName(), Document.class);
        log.info("结果输出完成,耗时:{}秒", (System.currentTimeMillis() - startTime)/1000);
    }
}

MongoTemplate增强版

使用手册:https://loser.plus/

使用MyBatisPlus的方式,优雅的操作MongoDB。

这种方式是如同Mysql表结构一样,已知集合名称和字段名称,预先定义好字段类型,自动与Mongodb进行关系映射。

与SpringBoot集成Mongodb文档数据库相似的内容:

SpringBoot集成Mongodb文档数据库

添加Maven依赖 org.springframework.boot spring-boot-starter-data-mongodb 配置Mongodb连接

一文读懂Apollo客户端配置加载流程

SpringBoot集成Apollo源码分析 本文基于 apollo-client 2.1.0 版本源码进行分析 Apollo 是携程开源的配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。 Apollo支持4个维度管理Key-

Springboot集成Netty实现TCP通讯

Netty

[转帖]Springboot 集成 micrometer(actuator/prometheus) 接口报 404

https://blog.csdn.net/qq_26545503/article/details/123313891 原因 主要是spring-boot版本和micrometer版本没有对应上,我用的spring-boot是2.6.0对应的micrometer就是1.8 需要修改两个地方 pom.

SpringBoot 集成 Quartz + MySQL

Quartz 简单使用 Java SpringBoot 中,动态执行 bean 对象中的方法 源代码地址 => https://gitee.com/VipSoft/VipBoot/tree/develop/vipsoft-quartz 工作原理解读 只要配置好 DataSource Quartz 会

SpringBoot SpringSecurity 介绍(基于内存的验证)

SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘 SpringBoot已经为用户采用默认配置,只需要引入pom依赖就能快速启动Spring Security。 目的:验证请求用户的身份,提供安全访问 优势:基于Spring,配置方便,减少大

Spring Security 报:Encoded password does not look like BCrypt

SpringBoot 集成 Security 时,报 Encoded password does not look like BCrypt 原因:SecurityConfig 必须 Bean 的形式实例化 /** * 配置用户身份的configure()方法 * * @param auth * @t

SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘

SpringBoot 集成 SpringSecurity + MySQL + JWT 无太多理论,直接盘 一般用于Web管理系统 可以先看 SpringBoot SpringSecurity 基于内存的使用介绍 本文介绍如何整合 SpringSecurity + MySQL + JWT 数据结构 数

教你如何搞定springboot集成kafka

本文分享自华为云社区《手拉手入门springboot+kafka》,作者:QGS。 安装kafka 启动Kafka本地环境需Java 8+以上 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 Kafka启动方式有Zookeeper和Kraft,两种方式只

【Azure Developer】Springboot 集成 中国区的Key Vault 报错 AADSTS90002: Tenant 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' not found

spring.cloud.azure.keyvault.secret.property-sources[0].profile.cloud-type=AZURE_CHINA