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
如果对以上代码有任何问题都可以加我咨询

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