springboot - mongodb 整合
基于 mongo:4.4.2
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
配置文件
spring.data.mongodb.host=localhost
spring.data.mongodb.database=mybatis
spring.data.mongodb.port=27017
spring.data.mongodb.username=admin
spring.data.mongodb.password=admin
spring.data.mongodb.authentication-database=admin
# 或者使用 uri
spring.data.mongodb.uri=mongodb://stwuser:111111@127.0.0.1:27017/stw?minPoolSize=0&maxPoolSize=200\
&waitQueueMultiple=500&maxIdleTimeMS=15000&maxIdleTimeMS=20&waitQueueTimeoutMS=300000
# &authSource=admin&authMechanism=SCRAM-SHA-1
数据模型
@Data
public class Person {
private String id;
private String name;
private int age;
private List<String> hobby;
private String province;
private Integer salary;
}
插入数据
@Test
public void insert() {
Person person = new Person();
person.setHobby(Arrays.asList("football"));
person.setProvince("SH");
person.setSalary(100);
person.setId("3");
person.setName("Tom");
person.setAge(20);
Person p = mongoTemplate.insert(person, "person");
System.out.println(JSON.toJSONString(p));
}
查询全部
@Test
public void queryAll(){
List<Person> list = mongoTemplate.find(new Query(), Person.class);
System.out.println(JSON.toJSONString(list));
}
结果
[
{"age":10,"hobby":["football","pingpong"],"id":"1","name":"Luffy","province":"JX","salary":200},
{"age":100,"hobby":["football","pingpong","golf"],"id":"2","name":"Jack","province":"SH","salary":300},
{"age":20,"hobby":["snok"],"id":"3","name":"Tom","province":"SH","salary":100}
]
条件查询
/**
* criteria query
* select * from person where name = 'Tom'
*/
@Test
public void queryCriteria(){
Query query = new Query();
query.addCriteria(Criteria.where("name").is("Tom"));
Person person = mongoTemplate.findOne(query, Person.class);
System.out.println(JSON.toJSONString(person));
}
结果
# result
{"age":20,"hobby":["snok"],"id":"3","name":"Tom","province":"SH","salary":100}
分页查询
默认第一页从0开始
//======================= page operations =================
/**
* select * from person order by salary desc limit 0,2
*/
@Test
public void pageTest(){
// page start based zero
int page=0;
int pageSize =2;
Query query = new Query();
Sort salary = Sort.by(Sort.Direction.DESC, "salary");
query.with(PageRequest.of(page, pageSize, salary));
List<Person> list = mongoTemplate.find(query, Person.class);
System.out.println(JSON.toJSONString(list));
}
// 或者
@Test
public void pagePerson(){
int page = 3;
int pageSize = 3;
Query query = new Query();
query.addCriteria(Criteria.where("name").regex("hello"));
query.with(Sort.by(Sort.Order.desc("age")));
query.limit(pageSize);
query.skip((page-1)*pageSize);
List<Person> list = mongoTemplate.find(query, Person.class);
System.out.println(JSON.toJSONString(list));
}
结果
# result
[
{"age":100,"hobby":["football","pingpong","golf"],"id":"2","name":"Jack","province":"SH","salary":300},
{"age":10,"hobby":["football","pingpong"],"id":"1","name":"Luffy","province":"JX","salary":200}
]
范围查询
//======================= range operations =================
/**
* select * from person where hobby contains ("football" and "golf")
* contains both!!
*/
@Test
public void findAllCollection(){
Query query = new Query();
Criteria criteria = Criteria.where("hobby").all(Arrays.asList("football","golf"));
query.addCriteria(criteria);
List<Person> list = mongoTemplate.find(query, Person.class);
System.out.println(JSON.toJSONString(list));
}
# result
[{"age":100,"hobby":["football","pingpong","golf"],"id":"2","name":"Jack","province":"SH","salary":300}]
/**
* select * from person where hobby in( "football", "golf") only need contains one
*/
@Test
public void findInCollection(){
Query query = new Query();
Criteria criteria = Criteria.where("hobby").in(Arrays.asList("football","golf"));
query.addCriteria(criteria);
List<Person> list = mongoTemplate.find(query, Person.class);
System.out.println(JSON.toJSONString(list));
}
聚合查询
分组查询
//======================= aggregation operations =================
/**
* select province, sum(salary) as salary from person group by province
* [{"_id":"SH","salary":400},{"_id":"JX","salary":200}]
*/
@Test
public void groupByTest(){
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.group("province")
.sum("salary").as("salary"));
List<Map> person = mongoTemplate.aggregate(aggregation, "person", Map.class).getMappedResults();
System.out.println(JSON.toJSONString(person));
}
结果
# result
[{"_id":"SH","salary":400},{"_id":"JX","salary":200}]
更新
@Test
public void updateOne(){
Query query = new Query();
query.addCriteria(Criteria.where("id").is("3"));
UpdateResult updateResult = mongoTemplate.updateFirst(query,
Update.update("hobby", Arrays.asList("snok")), Person.class);
System.out.println(JSON.toJSONString(updateResult));
}
删除
@Test
public void delete(){
Query query = new Query();
query.addCriteria(Criteria.where("name").is("Tom"));
DeleteResult remove = mongoTemplate.remove(query, Person.class);
System.out.println(JSON.toJSONString(remove));
}
@Test
public void deleteAll(){
Query query = new Query();
query.addCriteria(Criteria.where("name").regex("Tom"));
List<Person> allAndRemove = mongoTemplate.findAllAndRemove(query, Person.class);
System.out.println(JSON.toJSONString(allAndRemove));
}
问题
Exception authenticating MongoCredential{mechanism=SCRAM-SHA-256, userName=**
解决方案
spring.data.mongodb.host=localhost
spring.data.mongodb.database=mybatis
spring.data.mongodb.port=27017
spring.data.mongodb.username=admin
spring.data.mongodb.password=admin
## 需要加上这个, 要到admin库认证 !!
spring.data.mongodb.authentication-database=admin