文章目录
导入mongodb依赖
<!--mongodb依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
导入JSON依赖,后续会用到
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.52</version>
</dependency>
配置mongodb连接信息
注意:有时间mongodb会设置认证库你只有认证成功之后才可正常连接
参考配置如下
#配置mongodb链接信息
data:
mongodb:
#语法就是 mongodb://用户名:密码@IP:端口/认证库名称
uri: mongodb://admin:20080512@139.199.95.108:20004/test
#database就是你要连接的集合库
database: TF_Iot_Energy
#配置mongodb链接信息
spring:
data:
mongodb:
host: 你的mongodb IP
port: 端口
database: 数据库名称
参考我的mongodb数据格式信息如下
{
"_id": ObjectId("5dc4d35a376d27162c1cd487"),
"_time": "2019-11-08 10:30:50",
"tenant_code": "YR0086",
"machine_code": "/",
"machine_name": "",
"scheme_code": "0010",
"scheme_name": "1#4#打底机化料台水表",
"group_no": "",
"gather_data": [
{
"param_code": "Cum_flow",
"param_name": "累计流量",
"param_value": "82203.47",
"param_type": "steam",
"value_type": ""
}
],
"topic": "1.Bladex_tfenergy.YR0086./.9CA5258434AE.0010"
}
// 2
{
"_id": ObjectId("5dc4d360376d27162c1cd4b4"),
"_time": "2019-11-08 10:30:56",
"tenant_code": "YR0086",
"machine_code": "/",
"machine_name": "",
"scheme_code": "0010",
"scheme_name": "1#染色蒸汽表",
"group_no": "",
"gather_data": [
{
"param_code": "Cum_flow",
"param_name": "累计流量",
"param_value": "82203.48",
"param_type": "steam",
"value_type": ""
}
],
"topic": "1.Bladex_tfenergy.YR0086./.9CA5258434AE.0010"
}
mongodb依赖注解进行映射
以下注解基本用于实体属性注解
@Document(collection="指定集合名称")
@Data jdk1.8新特性 代替了get/set
@Field("指定你的mongodb数据库的key 也就是字段名称")
如果不想为每个属性都添加@Field,那么你必须把属性名称和你的mongodb名称指定一致
基本查询(我只分享我用到的)
Query:用于配置查询时的条件存储容器
Criteria:用于组装查询条件给Query
MongoTemplate:用于连接Mongodb查询返回结果集
依据上面提供数据格式信息进行查询操作如下
//需求1:查询1#染色蒸汽表一段时间之内的数据用于前台展示趋势图
Query query=new Query();
Criteria criterName=Criteria.where("scheme_name").is(schemeName);
Criteria criteria= Criteria.where("_time").gte(开始时间)
.andOperator(Criteria.where("_time").lte(结束时间))
query.addCriteria(criterName);
query.addCriteria(criteria);
List<实体>lists=mongoTemplate.find(query,实体.class);
//需求2:在需求1上增强(在一段时间之内取集合中param_name为累计流量的数据)
Query query=new Query();
Criteria criterName=Criteria.where("scheme_name").is(schemeName);
Criteria criteria= Criteria.where("_time").gte(开始时间)
.andOperator(Criteria.where("_time").lte(结束时间))
.and("gather_data").elemMatch(Criteria.where("param_name").is("累计流量"));
query.addCriteria(criterName);
query.addCriteria(criteria);
List<实体>lists=mongoTemplate.find(query,实体.class);
//其它的根据业务进行灵活查询,还有很多种~~
mongodb聚合查询
//最后查出来满足条件的集合
List<实体> list =new List();
//这个AggregationOperation是用来你分组之后显示字段用的
List<AggregationOperation> list = new ArrayList<>();
//group方法用于分组,它的参数是支持多个参数分组,我这里以一个字段分组
//$可带可不带,底层我也不太清楚,这是我自己试出来的,之后再研究,你先记住
//然后我分组之后我要取的是time最大时间的数据
//as注意我这里是取的别名(你必须要对应你的实体属性名称)
//first是我不参与条件查询,但是我分组之后的数据我需要展示它,然后你就加上就行了
GroupOperation groupScheme = Aggregation.group("$schemeName").
max("$time").as("time").
first("$cumFlow").as("cumFlow").
first("$insflow").as("insflow");
//project参数也是支持多个,你显示的字段需要和上面的一致,不一致有可能出错,这样写我觉得也是
//比较正规的
ProjectionOperation projectionOperation =
Aggregation.project("$schemeName", "$time", "$cumFlow", "$insflow");
//这里分组的条件,显示的条件我都封装好之后,需要添加至AggregationOperation集合
list.add(groupScheme);
list.add(projectionOperation);
//生成待执行条件
TypedAggregation<TFlotEnergy> typedAggregation =
Aggregation.newAggregation("你的实体名称".class, list);
//执行条件 返回数据
AggregationResults<TFlotEnergy> aggregate =
mongoTemplate.aggregate(typedAggregation, "TF_000000", TFlotEnergy.class);
//mappedResults是取的你分组之后满足分组字段的值而不是最终结果
//List<TFlotEnergy> mappedResults = aggregate.getMappedResults();
//获得执行之后的XML数据
Document rawResults = aggregate.getRawResults();
//它的底层是一个对象,因为我们是查询所以它可能是多个,就需要强转一下
ArrayList<Document> results = (ArrayList<Document>) rawResults.get("results");
//利用Springblade封装方法判断是否为空,当然你也可以用其它的都可以
if (Func.isNotEmpty(results)) {
for (Document result : results) {
//Document是xml形式,如果我们要转成自己的对象,有多个方法,字符串转,json转,数组转都行
//我这里展示json
String json = result.toJson();
//利用阿里巴巴的fastjson进行转对象
TFlotEnergy tFlotEnergy = JSONObject.parseObject(json, TFlotEnergy.class);
//添加至结果集合当中
list.add(tFlotEnergy);
}
}
mongodb(Query查询)
注意;mongo-java Aggregation聚合查询不走索引
实例
注入MongoTemplate
private MongoTemplate mongoTemplate;
- 查询在时间集合内数据集合
Criteria criteriaQuery = Criteria.where("machine_code").is(machineCode)
.and("_time").in(timeDiffs)
.and("param_name").is(paramName);
Query querys = new Query(criteriaQuery);
List<CurveDtoTwo> curveDtoList = mongoTemplate.find(querys, CurveDtoTwo.class);
- 查询指定时间数据对象
Criteria criteriaTime = Criteria.where("machine_code").is(machineCode)
.and("_time").is(timeDiff)
.and("param_name").is(paramName);
//获取当前时间点-查询是否有数据
CurveDtoTwo currDataDto = mongoTemplateTwo.findOne(new Query(criteriaTime), CurveDtoTwo.class);
- 查询时间段内数据集合
//组装
Criteria criteriaQueryTT = Criteria.where("machine_code").is(machineCode).and("_time").gte(开始时间)
.lte(结束时间)
.and("param_name").is(paramName);
//按照时间排序并且可以分页
Query queryTT=new Query(criteriaQueryTT).with(Sort.by(Sort.Order.asc("_time"))).skip(current).limit(size);;
List<CurveDtoTwo> curveDtos = mongoTemplate.find(queryTT, CurveDtoTwo.class);
Mongo组装对象JAVA
配置文件书写信息
mongo:
urls: mongodb://username:password@IP:端口/认证用户
datasources: 连接数据库(集合)
抽象类新建
package org.tfcloud.energy.mongo;
import com.mongodb.MongoClientURI;
import lombok.Data;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
/**
* 抽象类-Mongo
*/
@Data
public abstract class MongoConfig {
private String uri;
/*
* Method that creates MongoDbFactory Common to both of the MongoDb
* connections
*/
public MongoDbFactory mongoDbFactory() throws Exception {
return new SimpleMongoDbFactory(new MongoClientURI(uri));
}
/*
* Factory method to create the MongoTemplate
*/
abstract public MongoTemplate getMongoTemplate() throws Exception;
}
JAVA组装
package org.tfcloud.energy.mongo;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* Mongo
*/
@Component
@Configuration
@Data
public class AbstractMongoDbConfig extends MongoConfig {
@Value("${spring.data.mongodb.uri}")
private String uri;
@Value("${spring.data.mongodb.database}")
private String fileDatabase;
/**
* 宝龙数据源创建
* @return
* @throws Exception
*/
@SuppressWarnings("all")
@Primary
@Bean(name = "mongobaolong")
@Override
public MongoTemplate getMongoTemplate() throws Exception {
List<ServerAddress> addressList=new ArrayList<>();
List<MongoCredential> credentials=new LinkedList<>();
String newUrl = uri.replace("mongodb://", "");
String username = StringUtils.substringBefore(newUrl, ":");
String psdUrl = newUrl.replace(username + ":", "");
String password = StringUtils.substringBefore(psdUrl, "@");
String ipUrl = psdUrl.replace(password + "@", "");
String ip = StringUtils.substringBefore(ipUrl, ":");
String portUrl = ipUrl.replace(ip + ":", "");
Integer port = Integer.parseInt(StringUtils.substringBefore(portUrl, "/"));
String source = portUrl.replace(port + "/", "");
MongoCredential mongoCredential=MongoCredential
.createScramSha1Credential(username
,source,password.toCharArray());
credentials.add(mongoCredential);
ServerAddress serverAddress=new ServerAddress(ip,port);
addressList.add(serverAddress);
MongoClient mongoClient=new MongoClient(addressList, credentials);
return new MongoTemplate(new SimpleMongoDbFactory(mongoClient,fileDatabase));
}
}
扩展其它参数形式组装MongoTemplate
package org.tfcloud.energy.mongo;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import lombok.Data;
import org.springframework.context.annotation.Bean;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* mongo
*/
@Component
@Data
public class AbstractMongoDbConfigTwo extends MongoConfig{
//用户名
private String username;
//认证库
private String source;
//密码
private String password;
//IP
private String ip;
//端口
private Integer port;
//链接数据库
private String fileDatabase;
/**
* 139数据源创建
* @return
* @throws Exception
*/
@SuppressWarnings("all")
//@Bean("mongotianfu")
public MongoTemplate getMongoTemplateTwo(String username,String source,String password,String ip,Integer port,String fileDatabase) throws Exception {
List<ServerAddress> addressList=new ArrayList<>();
List<MongoCredential> credentials=new LinkedList<>();
MongoCredential mongoCredential=MongoCredential
.createScramSha1Credential(username,source,password.toCharArray());
credentials.add(mongoCredential);
ServerAddress serverAddress=new ServerAddress(ip,port);
addressList.add(serverAddress);
MongoClient mongoClient=new MongoClient(addressList, credentials);
return new MongoTemplate(new SimpleMongoDbFactory(mongoClient,fileDatabase));
}
@Override
public MongoTemplate getMongoTemplate() throws Exception {
return null;
}
}
原生查询
db.TF_YR0086.find(
{
"$and": [
{
"machine_code": "013"
},
{
"_time": {
"$gte": "2020-04-19 22:17:55"
},
"$and": [{
"_time": {
"$lte": "2020-04-20 00:17:33"
}
}]
},
{
"scheme_code": "002c"
}, {
"param_code": "elec"
}
]
}
)
db.TF_YR0086.find(
{
"$and": [
{
"machine_code": "013"
},
{
"_time": "2020-04-19 22:26:02"
},
{
"param_code": "elec"
}
]
}
)
db.TF_YR0086.find(
{
"machine_code": "014",
"_time": {
"$gte": "2020-04-01 01:24:59",
"$lte": "2020-04-01 02:49:21"
},
"param_code": "5#temp"
}
)
联系博主方式
微信:x331191249 QQ:2509647976
如果对以上代码有任何问题都可以加我咨询