SpringBoot集成Mongodb文档数据库
添加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存储文件、读取文件
一.前言和开发环境及配置 可以转载,但请注明出处. 之前自己写的SpringBoot整合MongoDB的聚合查询操作,感兴趣的可以点击查阅. https://www.cnblogs.com/zaoyu ...
- springboot集成mongoDB 异常认证
1.springboot连接mongoDB 出现异常认证 异常详情: com.mongodb.MongoSecurityException: Exception authenticating Mong ...
- SpringBoot集成MongoDB之导入导出和模板下载
前言 自己很对自己在项目中集成MongoDb做的导入导出以及模板下载的方法总结如下,有不到之处敬请批评指正! 1.pom.xml依赖引入 <!-- excel导入导出 --> <de ...
- SpringBoot集成MongoDB
前言 之前写了各种nosql数据库的比较,以及相关理论,现在我在本地以springboot+MongoDB框架,探究了具体的运行流程,下面总结一下,分享给大家. 运行前准备 安装并启动MongoDB应 ...
- springboot 集成mongodb
环境依赖 在pom文件引入spring-boot-starter-data-mongodb依赖: <dependency> <groupId>org.springframewo ...
- SpringBoot 集成mongodb(1)单数据源配置
新项目要用到mongodb,于是在个人电脑上的虚拟环境linux上安装了下mongodb,练习熟悉下. 1.虚拟机上启动mongodb. 首先查看虚拟机ip地址,忘了哈~~ 命令行>ifconf ...
- springboot集成mongoDB简易使用
1.首先是添加Spring Data mongo的配置依赖 <dependency> <groupId>org.springframework.boot</groupId ...
- Springboot集成MongoDB实现CRUD
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- springboot集成mongoDB需要认证
报错: Mon Nov 25 01:09:48 CST 2019 There was an unexpected error (type=Internal Server Error, status=5 ...
- SpringBoot 集成mongodb(2)多数据源配置
github:https://github.com/xiaozhuanfeng/mongoProj 现MongoDB有两个数据库: pom.xml: <!-- mongodb 配置 --> ...
随机推荐
- docker / compose 的安装 和 体验
文档 官网文档 视频 视频 简介 课程内容 1.Docker Compose 容器编排 2.Docker Swarm #集群 热扩容 需要在阿里上买服务器,至少冲100+以上的人民币 文档: 集群方式 ...
- NASM中的ALIGN ALIGNB SECTALIGN
ALIGN与ALIGNB NASM中的ALIGN与ALIGNB是用来字节对齐的,它们接收2个参数,第一个参数是必须的,表示对齐的字节数(必须是2的幂),第二个参数是可选的,表示为了对齐而进行填充的内容 ...
- IDEA不能搜索插件解决方案
前言 平时在idea中搜索插件的时候,总是加载半天都不出,最后加载好久什么也没搜到,看到一篇大佬的解决博客,完美解决现将解决步骤分享如下: 1.首先打开系统设置,选择 Pligins,点击设置按钮(用 ...
- Semantic Kernel入门系列:利用Handlebars创建Prompts functions
引言 本章我们将学习通过Handlebars Prompts Template来创建Prompts functions. 什么是Handlebars? Handlebars是一个流行的 JavaScr ...
- 007. gitlab仓库管理
1. gitlab创建组 创建后: 组管理: 组创建完成后,开始创建用户 2. gtilab创建用户 这里无法直接创建密码,需要创建用户后在对用户进行操作修改密码 密码和权限设置,取消和开启创建组权限 ...
- kubernetes ingress部署
ingress概念 ingress与service,deployment同样都是k8s中的一种资源 ingress用于实现域名方式访问k8s内部应用 安装ingress 1. 安装helm: wget ...
- 【Java编程教程】详解Java 中的对象和类
在本页中,我们将了解 Java 对象和类.在面向对象的编程技术中,我们使用对象和类来设计程序. Java中的对象既是物理实体又是逻辑实体,而Java中的类只是逻辑实体. 什么是Java中的对象 具有状 ...
- 字符型 ASCLL编码 转义字符
字符(character) char 2字节 每一个字符的背后.都有一个数字做代表(对照,参照的表) 字符赋值 char cl = 'a';通过''单引号描述为字符赋值 整数赋值 char c2 ...
- map数据类型
MAP数据类型是一个类似于对象的数据类型 大型项目中会经常使用 通过 构造函数来定义MAP数据类型 con ...
- 剑指Offer-55.链表中环的入口结点(C++/Java)
题目: 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 分析: 利用快慢指针,如果链表中存在环的话,则快指针一定在环中的某个节点与慢指针相遇. 设头节点到链表的环的入口结点 ...