添加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文档数据库的更多相关文章

  1. Springboot集成MongoDB存储文件、读取文件

    一.前言和开发环境及配置 可以转载,但请注明出处. 之前自己写的SpringBoot整合MongoDB的聚合查询操作,感兴趣的可以点击查阅. https://www.cnblogs.com/zaoyu ...

  2. springboot集成mongoDB 异常认证

    1.springboot连接mongoDB 出现异常认证 异常详情: com.mongodb.MongoSecurityException: Exception authenticating Mong ...

  3. SpringBoot集成MongoDB之导入导出和模板下载

    前言 自己很对自己在项目中集成MongoDb做的导入导出以及模板下载的方法总结如下,有不到之处敬请批评指正! 1.pom.xml依赖引入 <!-- excel导入导出 --> <de ...

  4. SpringBoot集成MongoDB

    前言 之前写了各种nosql数据库的比较,以及相关理论,现在我在本地以springboot+MongoDB框架,探究了具体的运行流程,下面总结一下,分享给大家. 运行前准备 安装并启动MongoDB应 ...

  5. springboot 集成mongodb

    环境依赖 在pom文件引入spring-boot-starter-data-mongodb依赖: <dependency> <groupId>org.springframewo ...

  6. SpringBoot 集成mongodb(1)单数据源配置

    新项目要用到mongodb,于是在个人电脑上的虚拟环境linux上安装了下mongodb,练习熟悉下. 1.虚拟机上启动mongodb. 首先查看虚拟机ip地址,忘了哈~~ 命令行>ifconf ...

  7. springboot集成mongoDB简易使用

    1.首先是添加Spring Data mongo的配置依赖 <dependency> <groupId>org.springframework.boot</groupId ...

  8. Springboot集成MongoDB实现CRUD

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  9. springboot集成mongoDB需要认证

    报错: Mon Nov 25 01:09:48 CST 2019 There was an unexpected error (type=Internal Server Error, status=5 ...

  10. SpringBoot 集成mongodb(2)多数据源配置

    github:https://github.com/xiaozhuanfeng/mongoProj 现MongoDB有两个数据库: pom.xml: <!-- mongodb 配置 --> ...

随机推荐

  1. n个人围成一圈,顺序排号从1到n。从第一个人开始报数(从一到三如此循环)。凡是报到三的出局,最后剩下的一个人原始编号为?

    #include<stdio.h> int main(){ int num,n,i=0,flag=0; //num记录剩余人数,n记录总人数,i为原始编号,flag为编号123时的编号 p ...

  2. three.js教程5-几何体顶点UV坐标、纹理贴图TextureLoader

    1.纹理贴图 纹理贴图,是给MeshLambertMaterial等材质一些纹理图片,以达到更好的视觉效果. 使用方法:通过纹理贴图加载器TextureLoader的load()方法加载一张图片可以返 ...

  3. WebGL:使用着色器进行几何造型

    前言 本文将介绍如何使用着色器来进行几何造型,说到几何图形大家一定都不陌生,比如说三角形.圆形,接触过WebGL基础使用的小伙伴一定都知道怎么去在画布上绘制一个三角形,只要传入三个顶点坐标,并选择绘图 ...

  4. 2022最新的Dubbo-Admin各个版本打包方案

    目录 前景提要 环境整合 构建工具(参考工具部署方式) 官网查阅 打包 一.编译器打包 二.命令行打包 前景提要 很简单的一个操作很多人还在那整各种收费,明明是个免费开源的,干嘛让他们挣二手钱. 环境 ...

  5. [Unity] 实现AssetBundle资源加载管理器

    实现Unity AssetBundle资源加载管理器 AssetBundle是实现资源热更新的重要功能,但Unity为其提供的API却十分基(jian)础(lou).像是自动加载依赖包.重复加载缓存. ...

  6. mybatis-puls解决多数据源事务的问题

    直接上代码: pom: <!--JTA组件核心依赖--> <dependency> <groupId>org.springframework.boot</gr ...

  7. NOIP模拟82

    T1 魔法 解题思路 发现选择情况无非就是两种,连续的一段或者间隔为 \(R+B\) 的倍数的一段. 直接对于原序列贪心,每次选择可以消除的部分并将其删掉. 对于合法的情况将操作倒序输出即可. cod ...

  8. C++笔记(2)拷贝构造函数

    拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象. 如果在类中没有定义拷贝构造函数,编译器会自行定义一个.如果类带有指针变量,并有动态内存分配,则它必 ...

  9. 深入解读Prometheus Adapter:云原生监控的核心组件

    本文详述了Prometheus Adapter的部署与配置,通过三个实践案例展示其在Kubernetes环境中的应用,帮助用户实现基于自定义指标的自动扩展和跨集群统一监控. 关注作者,分享AI全维度知 ...

  10. IDEA顺序启动多个Spring Boot微服务

    上个月公司新开发的一个项目,需要使用微服务,将单体服务拆分成多个微服务.但是每次修改代码之后都需要启动多个微服务,改个代码,都要修改五分钟,启动半小时,但是idea可以设置将多个服务依次启动,减少操作 ...