@[TOC](MongoDB——Java Client API(Spring Data MongoDB))
MongoDB——Java Client API(Spring Data MongoDB)
关于文档注解
由于mongoDB使用是BSON进行存储,Java则是类与对象的概念,所以设计了一套注解用于标注
@Document
范围:类
作用:用来映射这个类的一个对象为mongo中一条文档数据。
属性:value 或 collection 用来指定操作的集合名称
@Id
范围:成员变量、方法上
作用:用来将成员变量的值映射为文档的_id的值
@Field
范围:用在成员变量、方法上
作用:用来将成员变量以及值映射为文档中一个key、value对
属性:name , value 用来指定在文档中key的名称,默认为成员变量名
@Transient
范围:成员变量、方法上
作用:用来指定改成员变量,不参与文档的序列化
查询条件Criteria
QuickStart
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2.配置yaml
spring:
data:
mongodb:
# IP地址
host: 192.168.112.128
# 连接URI mongodb://+ip地址+端口/集合名称
uri: mongodb://192.168.112.128:27107/demo
# 向外暴露的端口(我使用的是Docker设置的,一般为27017)
port: 27107
# 集合名称
database: demo
# 用户名
username: root
3.注入MongoTemplate
@Autowired(required = false)
private MongoTemplate mongoTemplate;
4. 使用
/**
* 判断集合是否存在
*/
@Test
void collectExit(){
final boolean exist = mongoTemplate.collectionExists("users");
System.out.println(exist);
}
方法
判断集合是否存在
/**
* 判断集合是否存在
*/
@Test
void collectExit(){
final boolean exist = mongoTemplate.collectionExists("users");
System.out.println(exist);
}
创建集合
/**
* 创建集合
*/
@Test
void contextLoads() {
mongoTemplate.createCollection("users");
}
删除集合
/**
* 删除集合
*/
@Test
void dropCollection(){
mongoTemplate.dropCollection("users");
}
添加文档
其中insert和save
方法都可以添加文档
区别:
insert方法插入重复数据会显示主键重复,还可以进行批处理,批量需要指定集合类型
save方法则会直接更新
/**
* 文档添加
*/
@Test
void docInsert() {
final User user = new User();
user.setUserId(101);
user.setUsername("wangwu");
user.setHeight(188.6D);
//insert方法插入重复数据会显示主键重复,还可以进行批处理,批量需要指定集合类型
mongoTemplate.insert(user);
//save方法则会直接更新
// mongoTemplate.save(user);
}
查询所有文档
/**
* 文档查询所有
*/
@Test
void docQueryAll() {
final List<User> users = mongoTemplate.findAll(User.class);
for (User user : users) {
System.out.println(user);
}
}
ID查询
/**
* 文档查询(根据ID查)
*/
@Test
void docQueryByID() {
final User user = mongoTemplate.findById(100, User.class);
System.out.println(user);
}
条件查询
/**
* 条件查询
*/
@Test
void docQueryByField() {
final List<User> users = mongoTemplate.find(Query.query(Criteria.where("username").is("zhangsan")), User.class);
users.forEach(System.out::println);
}
and查询
/**
* And查询
* 多条件连接查询,需要注意类型
*/
@Test
void linkQueryAND() {
final List<User> users = mongoTemplate.find(Query.query(Criteria.where("username").is("zhangsan").and("height").is(192.6D)), User.class);
users.forEach(System.out::println);
}
Or查询
/**
* Or查询
*/
@Test
void linkQueryOr() {
final Criteria criteria = new Criteria();
criteria.orOperator(
Criteria.where("username").is("zhangsan"),
Criteria.where("username").is("wangwu")
);
final List<User> users = mongoTemplate.find(Query.query(criteria), User.class);
users.forEach(System.out::println);
}
查询后排序
/**
* 排序
*/
@Test
void sortQuery() {
final Query query = new Query();
query.with(Sort.by(Sort.Order.desc("height")));
final List<User> users = mongoTemplate.find(query, User.class);
users.forEach(System.out::println);
}
分页查询
/**
* 分页
*/
@Test
void pageQuery() {
final Query query = new Query();
query.with(Sort.by(Sort.Order.desc("height"))).skip(0).limit(3);
final List<User> users = mongoTemplate.find(query, User.class);
users.forEach(System.out::println);
}
查询文档条数
/**
* 获取总条数
*/
@Test
void getCount() {
final long count = mongoTemplate.count(new Query(), User.class);
System.out.println(count);
}
去重
/**
* 去重
*/
@Test
void distinctQuery() {
final List<Double> height = mongoTemplate.findDistinct(new Query(), "height", User.class, Double.class);
for (Double aDouble : height) {
System.out.println(aDouble);
}
}
更新文档数据(单条)
/**
* 更新(单条)
*/
@Test
void docUpdate() {
final Update update = new Update();
update.set("username", "xiaogou");
mongoTemplate.updateFirst(Query.query(Criteria.where("username").is("zhangsan")), update, User.class);
final List<User> all = mongoTemplate.findAll(User.class);
all.forEach(System.out::println);
}
更新文档数据(多条)
/**
* 更新(多条)
*/
@Test
void docUpdateMulti() {
final Update update = new Update();
update.set("username", "xiaogou");
mongoTemplate.updateMulti(Query.query(Criteria.where("username").is("zhangsan")), update, User.class);
final List<User> all = mongoTemplate.findAll(User.class);
all.forEach(System.out::println);
}
插入更新
/**
* 插入更新,不存在则插入
*/
@Test
void insertUpdate() {
final Update update = new Update();
update.setOnInsert("_id", 12);
update.set("username", "xiaogou");
mongoTemplate.updateMulti(Query.query(Criteria.where("username").is("zhangsan")), update, User.class);
final List<User> all = mongoTemplate.findAll(User.class);
all.forEach(System.out::println);
}
删除所有文档数据
/**
* 删除所有
*/
@Test
void delAllDoc(){
mongoTemplate.remove(new Query(),User.class);
}
条件删除
/**
* 条件删除
*/
@Test
void delDocBy(){
mongoTemplate.remove(Query.query(Criteria.where("username").is("xiaogo")),User.class);
}