MongoDB
简介:springboot中MongoTemplate使用记录
1.1 依赖
<!--mongodb-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
1.2 yml配置文件
spring:
data:
mongodb:
database: 数据库名
host: ip地址
port: 端口号(默认是27017)
username: 账号
password: 密码
集群写法:
spring:
data:
mongodb:
uri: mongodb://user:pwd@ip1:端口,ip2:端口/数据库
1.3 依赖注入
@Autowired
MongoTemplate mongoTemplate;
1.4 插入文档
1 创建一个与数据库对应的实体类:MongoTestClazz
package com.peiyj.entity;
import lombok.Data;
import lombok.ToString;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
@Data
@ToString
@Document("mongo_test_clazz")
public class MongoTestClazz {
@Field(name="id")
private Integer id;
private String name;
private Integer age;
private String gender;
}
@Document:表示对应mongodb中的哪一个集合(mongodb里的集合就是mysql里的表)
@Field:表示对应文档中的域(mongodb中域就是mysql里的字段)
类名无所谓,随便起的。
如果没有对应的集合会自动生成一个集合。
如果没有对应的域(域就是mysql里的字段)mongodb也会自动生成。
2 调用MongoTemplate的方法插入文档
@Test
public void add(){
//把要插入的值封装到对象的属性中
MongoTestClazz mongoTestClazz = new MongoTestClazz();
mongoTestClazz.setId(2);
mongoTestClazz.setName("xiaoming");
mongoTestClazz.setAge(18);
mongoTestClazz.setGender("男");
//调用插入语法 insert()
mongoTemplate.insert(mongoTestClazz);
}
如果实体类上没有 @Document 这个注解,调用方法可以写成:
mongoTemplate.insert(mongoTestClazz,"mongo_test_clazz");
2 批量添加
@Test
public void addList(){
MongoTestClazz mongoTestClazz1 = new MongoTestClazz();
mongoTestClazz1.setId(3);
mongoTestClazz1.setName("xiaohong");
mongoTestClazz1.setAge(19);
mongoTestClazz1.setGender("女");
MongoTestClazz mongoTestClazz2 = new MongoTestClazz();
mongoTestClazz2.setId(5);
mongoTestClazz2.setName("xiaoxiao");
mongoTestClazz2.setAge(20);
mongoTestClazz2.setGender("女");
List list = Lists.newArrayList();
//把对象放入List中
list.add(mongoTestClazz1);
list.add(mongoTestClazz2);
mongoTemplate.insert(list,MongoTestClazz.class);
}
调用 insert()插入List时要给定类型 :MongoTestClazz.class
1.5 删除文档
调用mongoTemplate.remove()方法 删除id为2的文档
@Test
public void del(){
mongoTemplate.remove(
new Query(Criteria.where("id").is(2)),
MongoTestClazz.class);
}
说明:
Criteria criteria = new Criteria();
criteria.where("id").is(1);
Query query=new Query(criteria);
mongoTemplate.remove(query,MongoTestClazz.class);
query:表示筛选条件
1.6 更新文档
更新文档可以使用 updateMulti()方法
@Test
public void update(){
Query query=new Query(Criteria.where("id").is(3));
Update update= new Update().set("name","xiaolan");
//更新查询返回结果集的所有
mongoTemplate.updateMulti(query, update, MongoTestClazz.class);
}
说明:
query:表示筛选条件
update:更改的数据
1.7 查询文档
1 查询全部
@Test
public void query(){
Query query = new Query();
List<MongoTestClazz> mongoTestClazzes =
mongoTemplate.find(
query,
MongoTestClazz.class
);
mongoTestClazzes.forEach(System.out::println);
}
控制台输出:
MongoTestClazz(id=3, name=xiaolan, age=19, gender=女)
MongoTestClazz(id=5, name=xiaoxiao, age=20, gender=女)
说明:
query:表示筛选条件
如果筛选条件是空,则查询全部。
2 条件查询
查询id为3的文档
@Test
public void query1(){
List<MongoTestClazz> mongoTestClazzes =
mongoTemplate.find(
Query.query(Criteria.where("id").is(3)),
MongoTestClazz.class
);
mongoTestClazzes.forEach(System.out::println);
}
或者
@Test
public void query2(){
Criteria criteria = new Criteria();
criteria.and("id").is(3);
List<MongoTestClazz> mongoTestClazzes =
mongoTemplate.find(
Query.query(criteria),
MongoTestClazz.class
);
mongoTestClazzes.forEach(System.out::println);
}
3 多条件查询
查询name为xiaolan,age为19的文档
@Test
public void query3(){
Criteria criteria = new Criteria();
criteria.and("name").is("xiaolan");
criteria.and("age").is(19);
List<MongoTestClazz> mongoTestClazzes =
mongoTemplate.find(
Query.query(criteria),
MongoTestClazz.class
);
mongoTestClazzes.forEach(System.out::println);
}
说明:
criteria.and(字段名).is(值);
criteria的where和and不能混合使用
4 分页查询
@Test
public void query4(){
//第几页
int pageNo = 1;
//每页显示条数
int pageSize = 3;
int beginIndex = (pageNo - 1) * pageSize;
Query query = new Query();
List<MongoTestClazz> mongoTestClazzes =
mongoTemplate.find(
query.skip(beginIndex).limit(pageSize),
MongoTestClazz.class
);
mongoTestClazzes.forEach(System.out::println);
}
5 模糊查询
查询name中包含lan的文档
String str = “lan”;
@Test
public void query5(){
String str = "lan";
Criteria criteria = new Criteria();
criteria.and("name").regex("^.*" + str + ".*$");
Query query = new Query(criteria);
List<MongoTestClazz> mongoTestClazzes =
mongoTemplate.find(
query,
MongoTestClazz.class
);
mongoTestClazzes.forEach(System.out::println);
}
说明:
mongodb支持正则表达式查询
左模糊,右模糊,可自行测试。
6 排序
我在数据库添加了几条数据 查看排序比较方便
@Test
public void query6(){
Query query = new Query();
query.with(Sort.by(
Sort.Order.asc("age")
));
List<MongoTestClazz> mongoTestClazzs =
mongoTemplate.find(query, MongoTestClazz.class);
mongoTestClazzs.forEach(System.out::println);
}
控制台打印结果:
多条件排序
我在数据库添加了分数这个域,并赋值:
先根据score排序 再根据age排序
在实体类中添加属性:
private Integer score;
@Test
public void query7(){
Query query = new Query();
query.with(Sort.by(
Sort.Order.desc("score"),
Sort.Order.desc("age")
));
List<MongoTestClazz> mongoTestClazzs =
mongoTemplate.find(query, MongoTestClazz.class);
mongoTestClazzs.forEach(System.out::println);
}
控制台输出:
7 聚合操作aggregate自定义排序
把年龄为12 或者 score 为7和2的排在最上面,再根据age排序
用法类似sql的case when
//mongodb java代码自定义排序
@Test
public void query8() {
ConditionalOperators.Cond cond = ConditionalOperators.when(
Criteria.where("age").is(12))
.then(999)
.otherwise(ConditionalOperators.when(
Criteria.where("score").in(7,2))
.then(999)
.otherwise(777));
Integer pageNo = 1;
Integer pageSize = 10;
int beginIndex = (pageNo - 1) * pageSize;
String orderTypeName = "";
Sort by = null;
orderTypeName = "age";
by = Sort.by(
Sort.Order.desc("aaa")
, Sort.Order.desc(orderTypeName)
);
Criteria criteria = new Criteria();
Aggregation agg = Aggregation.newAggregation(
Aggregation.match(criteria)
, Aggregation.project("id", "name", "age", "gender","score")
.and(cond).as("aaa")
, Aggregation.sort(by)
, Aggregation.skip(beginIndex)
, Aggregation.limit(pageSize)
);
AggregationResults<MongoTestClazz> mongoTestClazzes =
mongoTemplate.aggregate(agg, "mongo_test_clazz", MongoTestClazz.class);
mongoTestClazzes.getMappedResults().forEach(System.out::println);
}
控制台输出: