文章目錄
導入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;
}
}
聯繫博主方式
微信:x331191249 QQ:2509647976
如果對以上代碼有任何問題都可以加我諮詢