springboot整合mongodb:
mongodb集成 :
第一步:引如pom文件
第二步:配置文件配置mongodb路径:
第三步:关于mongodb的api操作整理如下:(这是根据springboot1.5.13版本做的整理,springboot2.x系列对mongodb的变动较大,后期我会整理发布)
package com.xf.water.springboot_mongdb; import com.mongodb.*;
import com.xf.water.springboot_mongdb.entity.A;
import com.xf.water.springboot_mongdb.entity.MaxValue;
import com.xf.water.springboot_mongdb.entity.Sl6512014;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.GroupOperation;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.test.context.junit4.SpringRunner; import java.util.List; /**
* @author : huhy on 2018/7/31.
* @Project_name:springboot_self_gitlab
* @LOCAL:com.xf.water.springboot_mongdb
* @description:mongodb的操作
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class MongodbUtilsTest { @Autowired
private MongoTemplate mongoTemplate; @Test
public void test(){
Query query6 = new Query(Criteria.where("a").lte("9"));
//设置安装某一个子段进行降序
query6.with(new Sort(Sort.Direction.DESC,"a"));
query6.maxScan(6).skip(0);
List<A> a = mongoTemplate.find(query6, A.class, "a");
for (A a1 : a) {
System.out.println(a1);
}
}
/**
* @author huhy
* @ClassName:MongodbUtilsTest
* @date 2018/7/31 17:03
* @Description: 获取当前mongodb中的使用库和当前数据库的链接测试
*/
@Test
public void testConnAndMongodb(){
/**
* mongoTemplate.getDb() 获取当前数据库
* mongoTemplate.dropCollection("a") 删除集合
* 创建集合: 根据类型或者直接指定集合名创建 同时可是设置集合内部的参数信息,大小,文档类型等
* <T> DBCollection createCollection(Class<T> var1);
* <T> DBCollection createCollection(Class<T> var1, CollectionOptions var2);
* DBCollection createCollection(String var1);
* DBCollection createCollection(String var1, CollectionOptions var2);
* 集合是否存在:
* <T> boolean collectionExists(Class<T> var1); 根据类型判断
* boolean collectionExists(String var1); 根据集合名判断
* mongoTemplate.getCollectionNames(); 获取所有集合名的列表
*/
System.out.println(mongoTemplate.getDb());
MongoClientURI mongoClientURI = new MongoClientURI("mongodb://yang:123456@localhost:27017/huhy");
MongoClient mongoClient = new MongoClient(mongoClientURI);
System.out.println(mongoClient);
mongoTemplate.dropCollection("a");
mongoTemplate.createCollection(A.class);
mongoTemplate.collectionExists("a");
mongoTemplate.getCollectionNames();
}
/**
* @author huhy
* @ClassName:MongodbUtilsTest
* @date 2018/8/1 14:02
* @Description: 测试mongoTemplate的CRUD操作
*/
@Test
public void testMongdbTemplateCrud(){
/**
* 添加文档主要介绍两种方式:
* mongoTemplate.insert("实体对象","集合名"); 往集合插入数据的方式
* mongoTemplate.save(对象,集合名(可省略)); 参数必须是对象
* insert和save都适用
* 不写集合名,默认对象类名作为集合名(如实体类是A 集合名是a)
* 写集合名,则把数据写到对应集合下
* 1.void save(Object var1); 传入对象,不传集合名
* 2.void save(Object var1, String var2); 传入对象,传集合名
* 3.void insert(Object var1); 传入对象,不传集合名
* 4.void insert(Object var1, String var2); 传入对象,传集合名
* 5.void insert(Collection<? extends Object> var1, Class<?> var2); 下面三个方法是批量插入的实现方法
* 6.void insert(Collection<? extends Object> var1, String var2);
* 7.void insertAll(Collection<? extends Object> var1);
* 查询mongodb的操作:
* find 和findone方法都有两种实现
* 1.List<T> find(Query var1, Class<T> var2) 不指定集合名
* 2.List<T> find(Query var1, Class<T> var2, String var3) 指定集合名
* 3.<T> T findOne(Query var1, Class<T> var2); 不指定集合名
* 4.<T> T findOne(Query var1, Class<T> var2, String var3);指定集合名
* eg。
* maxvalue在数据库中就对应一个集合,可以不指定集合名直接查询
* Sl6512014 在数据对应很多集合 必须知道集合名才能查询出数据
*
* findall
* 1.<T> List<T> findAll(Class<T> var1); 根据类型查询所有
* 2.<T> List<T> findAll(Class<T> var1, String var2); 查询集合下的该类型数据
*
* findById:
* <T> T findById(Object var1, Class<T> var2); var1 是mongodb的_id子段值
* <T> T findById(Object var1, Class<T> var2, String var3); 指定集合名
* 更新操作:
* updateFirst 更新符合条件的第一条 updateMulti 更新多个,符合条件都会更改
* //修改第一条符合条件数据
* 1.WriteResult updateFirst(Query var1, Update var2, Class<?> var3); 指定类型
* 2.WriteResult updateFirst(Query var1, Update var2, String var3); 更新操作指定集合名
* 3.WriteResult updateFirst(Query var1, Update var2, Class<?> var3, String var4); 详细指定类型和集合名
* //批量修改
* 4.WriteResult updateMulti(Query var1, Update var2, Class<?> var3); 指定类型
* 5.WriteResult updateMulti(Query var1, Update var2, String var3); 指定集合名
* 6.WriteResult updateMulti(Query var1, Update var2, Class<?> var3, String var4); 详细指定类型和集合名
* //同updateFirst
* 7.WriteResult upsert(Query var1, Update var2, Class<?> var3);
* 8.WriteResult upsert(Query var1, Update var2, String var3);
* 9.WriteResult upsert(Query var1, Update var2, Class<?> var3, String var4);
* 删除操作:
* 1.WriteResult remove(Object var1);
* 2.WriteResult remove(Object var1, String var2);
* 3.WriteResult remove(Query var1, Class<?> var2); 根据条件删除
* 4.WriteResult remove(Query var1, Class<?> var2, String var3); 详细指定类型和集合名进行删除
* 5.WriteResult remove(Query var1, String var2); 指定集合名进行删除
* 其他一些操作:简单介绍:
* //查询出后删除
* <T> List<T> findAllAndRemove(Query var1, String var2); 指定集合名
<T> List<T> findAllAndRemove(Query var1, Class<T> var2); 指定类型
<T> List<T> findAllAndRemove(Query var1, Class<T> var2, String var3); 在集合下查询删除的类型数据
//查处后修改
<T> T findAndModify(Query var1, Update var2, Class<T> var3); 指定修改类型
<T> T findAndModify(Query var1, Update var2, Class<T> var3, String var4); 在集合下修改的数据类型
<T> T findAndModify(Query var1, Update var2, FindAndModifyOptions var3, Class<T> var4);
<T> T findAndModify(Query var1, Update var2, FindAndModifyOptions var3, Class<T> var4, String var5);
<T> T findAndRemove(Query var1, Class<T> var2);
<T> T findAndRemove(Query var1, Class<T> var2, String var3);
//判断是否存在
boolean exists(Query var1, String var2);
boolean exists(Query var1, Class<?> var2);
boolean exists(Query var1, Class<?> var2, String var3);
*/
//insert操作
//mongoTemplate.save(new A("1","2","3"));
//mongoTemplate.insert(new A("1","2","3"));
Query query = new Query(Criteria.where("a").is("11"));
//find操作
/*Sl6512014 sl6512014_1 = mongoTemplate.findOne(query, Sl6512014.class);
Sl6512014 sl6512014_2 = mongoTemplate.findOne(query, Sl6512014.class,"1");
List<Sl6512014> sl6512014_3 = mongoTemplate.find(query, Sl6512014.class);
List<Sl6512014> sl6512014_4 = mongoTemplate.find(query, Sl6512014.class,"1");
System.out.println(sl6512014_1);*/
//update操作
/* Update update= new Update();
A a = mongoTemplate.findOne(query, A.class);
System.out.println(a);
update.set("a","1");*/
//更新两种方式
//mongoTemplate.updateFirst(query,update,A.class);
//mongoTemplate.updateFirst(query,update,"a");
// mongoTemplate.updateMulti(query,update,"a");
//mongoTemplate.upsert(query,update,A.class);
//mongoTemplate.remove(query,"a"); //测试一些其他方法
System.out.println(mongoTemplate.findById("5b615babec6032159050d879",A.class)); }
/**
* @author huhy
* @ClassName:MongodbUtilsTest
* @date 2018/7/31 17:17
* @Description: DBCollection下的简单使用
*/
@Test
public void testDBCollection(){
/**
* mongoTemplate.getCollection("error") 获取集合 一般获取之前判断是否存在
* collection.getCount() 集合下又有多少数据
* collection.find().next() 获取集合的第一条符合要求的数据
* collection.getFullName() 返回当前库+集合的名字组合
* collection.getName() 返回集合名
* collection.rename("fail") 修改集合名
* collection.distinct("ut") 返回值是list集合,返回的是ut的集合,并进行去重
* collection.createIndex("huhy") 在error集合上创建一个index 名字是huhy_1 不存在就创建 */
DBCollection collection = mongoTemplate.getCollection("error");
//这个集合下的数据量
System.out.println(collection.getCount());
//返回值是list集合,返回的是ut的集合,并进行去重
List serial = collection.distinct("ut");
System.out.println(serial);
DBCursor dbObjects = collection.find();
//next只会查询出符合条件的第一个数据
System.out.println(dbObjects.next());
//返回的库名+集合名
String fullName = collection.getFullName();
System.out.println(fullName);
//返回的集合名
System.out.println(collection.getName());
System.out.println(collection.getHintFields());
long count = collection.count();
System.out.println(count); // 有四种创建索引的方式,自己看api
collection.createIndex("yang"); }
/**
* @author huhy
* @ClassName:MongodbUtilsTest
* @date 2018/8/1 9:40
* @Description:Query的用法
* maxvalue在数据库中就对应一个集合,可以不指定集合名直接查询
* Sl6512014 在数据对应很多集合 必须知道集合名才能查询出数据
*/
@Test
public void testMongodbQuery(){
/**
* is相当于等于
* in相当于sql中的in
* ne相当于不等于
* orOperator接受多个条件,组成or逻辑 addOperator同理
* Criteria.where("author").is("mongodb") author = mongodb的数据
* Criteria.where("serial").lte(500).and("st").is("1703230781").and("c").in("5.7") 多条件的查询
* Criteria.where("st").exists(true) 判断这个字段存在
* Criteria.where("serial").ne(1) 不等于1的数据
* Criteria.where("serial").nin(1) nin 不在这个范围中
* Criteria.where("serial").is(3).orOperator().is().andOperator() 追加or条件或者and条件
* Criteria.where("a").regex("1") 模糊查询 可以用正则表达式
* query6.with(new Sort(Sort.Direction.DESC,"a")); 按照a字段把结果降序
* query6.skip(n); 跳过结果集的第n个 超过总条数就是啥都不输出 n<=0 时 查询到结束不跳过
* query6.skip(n).limit(m) 跳过n条并显示m条记录
* query6.addCriteria(Criteria.where("b").is("11")); 再加条件 查询子段不能是上一个query查询过的子段
* query6.maxScan(6).skip(-2); 先截取六条数据再跳过两条
* */
//通过整个mongodb中查询author = mongodb的数据,返回的一个对象
Query query = new Query(Criteria.where("author").is("mongodb"));
List<MaxValue> maxValues = mongoTemplate.find(query, MaxValue.class);
System.out.println(maxValues.size()); //Sl6512014在数据库中对应很多集合,在查询中要指定集合名
Query query1 = new Query(Criteria.where("serial").is(3));
List<Sl6512014> sl6512014s = mongoTemplate.find(query1, Sl6512014.class,"1");
System.out.println(sl6512014s.size()); // lte -- <= lt --- < gt --- > lgt---- >=
Query query2 = new Query(Criteria.where("serial").lte(1500));
List<Sl6512014> sl6512014s2 = mongoTemplate.find(query2, Sl6512014.class,"1703230781");
System.out.println(sl6512014s2.size()); //多条件的查询 and 增加条件,in 判断符合条件的数据
Query query3 = new Query(Criteria.where("serial").lte(500).and("st").is("1703230781").and("c").in("5.7"));
List<Sl6512014> sl6512014s3 = mongoTemplate.find(query3, Sl6512014.class,"1703230781");
System.out.println(sl6512014s3.size()); Query query4 = new Query(Criteria.where("st").exists(true));
List<Sl6512014> sl6512014s1 = mongoTemplate.find(query4, Sl6512014.class, "1703230781");
System.out.println(sl6512014s1.size());
//Criteria.where("serial").is(3).orOperator().is().andOperator()
Query query5 = new Query(Criteria.where("serial").is(3));
List<Sl6512014> sl6512014s5 = mongoTemplate.find(query5, Sl6512014.class, "1");
System.out.println(sl6512014s5.size());
//regex还可以用正则
Query query6 = new Query(Criteria.where("a").lte("9"));
//设置安装某一个子段进行降序
query6.with(new Sort(Sort.Direction.DESC,"a"));
query6.skip(3);
List<A> a = mongoTemplate.find(query6, A.class, "a");
for (A a1 : a) {
System.out.println(a1);
}
}
/**
* @author huhy
* @ClassName:MongodbUtilsTest
* @date 2018/8/1 13:34
* @Description: mongodb的高级用法,分组等操作
*/
@Test
public void testMongodbGroup(){
Criteria criteria = Criteria.where("a").in("1","2","3","4");
GroupOperation groupOperation = Aggregation.group("a").last("a").as("a").last("b").as("b").last("c").as("c");
Aggregation agg = Aggregation.newAggregation(A.class,Aggregation.match(criteria),groupOperation);
AggregationResults<A> a = mongoTemplate.aggregate(agg, "a", A.class);
List<A> mappedResults = a.getMappedResults();
for (A mappedResult : mappedResults) {
System.out.println(mappedResult);
}
}
/**
* @author huhy
* @ClassName:MongodbUtilsTest
* @date 2018/8/1 17:22
* @Description: 分组
*/
public List<Sl6512014> selectDataByGroupFildes(String collectionName,String... fildes){
Aggregation agg = Aggregation.newAggregation(
// 第一步:挑选所需的字段,类似select *,*所代表的字段内容
Aggregation.project("_id", "serial", "ut", "st", "tt", "pj",
"pt", "va", "vt", "z","zt","sbl1","turb","stt"),
// 第二步:sql where 语句筛选符合条件的记录
/* Aggregation.match(
Criteria.where("companyName").is(companyName).and("addedDate").gte(startTime).lte(endTime)),*/
// 第三步:分组条件,设置分组字段
Aggregation.group(fildes)
.count().as("allCount")// 增加COUNT为分组后输出的字段
.last("_id").as("id").last("serial").as("serial").last("ut").as("ut")
.last("st").as("st").last("tt").as("tt").last("pj").as("pj")
.last("pt").as("pt").last("va").as("va")
.last("vt").as("vt").last("z").as("z")
.last("zt").as("zt").last("sbl1").as("sbl1")
.last("turb").as("turb").last("stt").as("stt"),
// 第四步:重新挑选字段
Aggregation.project("id", "serial", "ut", "st", "tt", "pj",
"pt", "va", "vt", "z","zt","sbl1","turb","stt")
);
AggregationResults<Sl6512014> results = mongoTemplate.aggregate(
agg, collectionName, Sl6512014.class);
List<Sl6512014> mappedResults = results.getMappedResults();
return mappedResults;
} }