JAVA連接Mongodb查詢基本用法

導入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
如果對以上代碼有任何問題都可以加我諮詢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章