SpringDataMongoDB
使用Spring Data 框架都是按照面向对象思想操作用于的工具。使用Spring Data Mongodb 也是使用面向对象的方式进行操作MongoDB,省略了使用Mongodb的Java客户端API把Document转换为实体类的过程。
一、环境搭建
① 引入依赖
首先启动Linux下的mongodb服务器,关闭防火墙,用IDEA创建一个java项目,引入依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- spring data mongodb 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
② 编写配置
spring:
data:
# mongodb配置
mongodb:
# 服务器地址
host: 192.168.168.129
# 端口
port: 27017
# 用户名
username: uaad
# 密码
password: 'uaad'
# 认证数据库
authentication-database: admin
# 操作的数据库
database: test001
③ 编写启动类
我们在使用测试环境时,需要使用springboot环境以及配置,这里需要编写启动类,当我们测试类启动时,才会自动启动环境和配置
@SpringBootApplication
public class App {
public static void main( String[] args ) {
SpringApplication.run(App.class,args);
}
}
二、MongoDB基本操作测试
① 测试添加
@SpringBootTest(classes = App.class)
@RunWith(SpringRunner.class)
public class AppTest {
@Resource
private MongoTemplate mongoTemplate;
/*添加文档*/
@Test
public void insert(){
People people=new People();
people.setName("tangsan");
people.setAge(10);
People insert = mongoTemplate.insert(people);
System.out.println("----------------------"+insert);
}
}
② 修改文档
/*修改文档*/
@Test
public void save(){
People people=new People();
people.setId("61ae0b73efd95433cb8ddfa9");
people.setName("zhagnsan");
//有id就是修改,无id就是添加
People insert = mongoTemplate.save(people);
System.out.println("----------------------"+insert);
}
③ 更新文档
/*更新*/
@Test
public void update(){
//创建查询条件
Criteria criteria=Criteria.where("name").is("wangwu");
//添加至查询对象
Query query=new Query(criteria);
//创建修改内容
Update update=new Update();
//修改具体内容
update.set("name","zhagnsan0001");
//进行修改
UpdateResult updateResult = mongoTemplate.updateFirst(query, update, People.class);
System.out.println(updateResult);
//修改条数
System.out.println(updateResult.getMatchedCount());
//查询条数
System.out.println(updateResult.getModifiedCount());
}
④ 删除文档
/*更具id删除一条文档*/
@Test
public void delete(){
//创建要删除的对象
People people=new People();
people.setId("61aeb9a6f6aae50cd747b740");
people.setName("随便写");
//依主键为主
DeleteResult remove = mongoTemplate.remove(people);
//删除个数
System.out.println(remove.getDeletedCount());
}
/*根据条件删除*/
@Test
public void del(){
//此处的name可以是people的属性名,即便与数据库中的字段名不同,只要field注解标注即可
Criteria criteria=Criteria.where("name").is("zhangsan");
Query query=new Query(criteria);
//删除
DeleteResult remove = mongoTemplate.remove(query, People.class);
//删除条数
System.out.println(remove.getDeletedCount());
}
/*通过集合名删除*/
@Test
public void delColl(){
Criteria criteria=Criteria.where("name").is("zhangsan");
Query query=new Query(criteria);
//删除
DeleteResult remove = mongoTemplate.remove(query, "People");
//删除条数
System.out.println(remove.getDeletedCount());
}
都差不多
⑤ 查询文档
/*文档查询*/
@Test
public void query(){
List<People> all = mongoTemplate.findAll(People.class);
all.forEach(System.out::println);
}
/*条件查询*/
@Test
public void findIf(){
//创建查询条件
Criteria criteria=Criteria.where("age").is(50);
Query query=new Query(criteria);
//查询
List<People> all = mongoTemplate.find(query,People.class);
all.forEach(System.out::println);
}
/*主键查询*/
@Test
public void findId(){
People byId = mongoTemplate.findById("61aeb64bd4823564f80dacf5", People.class);
System.out.println(byId);
}
/*正则查询*/
@Test
public void regex() {
// java中正则不需要有//
Query query = new Query(Criteria.where("name").regex("zhang"));
List<People> list = mongoTemplate.find(query, People.class);
list.forEach(System.out::println);
}
/*多条件查询*/
@Test
public void orAnd() {
Criteria and1 = new Criteria();
and1.andOperator(Criteria.where("name").is("zhangsan"), Criteria.where("age").is(50));
Criteria and2 = new Criteria();
and2.andOperator(Criteria.where("name").is("lisi"), Criteria.where("age").is(50));
Criteria c = new Criteria();
c.orOperator(and1, and2);
List<People> list = mongoTemplate.find(new Query(c), People.class);
list.forEach(System.out::println);
}
/*排序查询*/
@Test
public void order(){
//创建查询条件
Query query=new Query(Criteria.where("age").gte(2));
//排序
query.with(Sort.by(Sort.Direction.DESC,"age"));
List<People> people = mongoTemplate.find(query, People.class);
people.forEach(System.out::println);
}
/*分页查询*/
@Test
public void pageQuery(){
Query query=new Query();
query.with(PageRequest.of(0,2,Sort.Direction.DESC,"age"));
List<People> people = mongoTemplate.find(query, People.class);
people.forEach(System.out::println);
}
分页查询,其余不做展示了
⑥ 聚合操作
/*聚合操作*/
@Test
public void aggregate02() {
/**
* group()参数必须是在People类中存在。
* 设置group参数,表示按照哪个属性进行分组
*/
TypedAggregation<People> aggregation = TypedAggregation.newAggregation(People.class,
Aggregation.group("name").count().as("count"));
AggregationResults<Map> result = mongoTemplate.aggregate(aggregation, Map.class);
// 当执行聚合函数返回结果为多行时使用此方法。
List<Map> list = result.getMappedResults();
list.forEach(System.out::println);
}