文章目录
提示:以下是本篇文章正文内容,MongoDB 系列学习将会持续更新
一、环境准备
①添加 SpringData 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
②配置 yml 文件,官方连接配置文档
方式一:
spring:
data:
mongodb:
uri: mongodb://root:123456@1.15.76.95:27017/library?authSource=admin
方式二:
spring:
data:
mongodb:
username: root
password: 123456
host: 1.15.76.95
port: 27017
database: library
authentication-database: admin
③直接注入 MongoTemplate 进行操作
@Resource
MongoTemplate mongoTemplate;
二、集合操作
@Test
public void testCollection(){
boolean exists = mongoTemplate.collectionExists("borrow");
if(exists) {
// 删除集合
mongoTemplate.dropCollection("borrow");
}else {
// 创建集合
mongoTemplate.createCollection("borrow");
}
Set<String> collectionNames = mongoTemplate.getCollectionNames();
System.out.println(collectionNames.toString()); // [borrow, book, user]
}
三、文档操作
3.1 实体类
@Document
- 修饰范围:用在类上。
- 作用:用来映射这个类的一个对象为 Mongo 中一条文档数据。
- 属性:(value 、collection) 用来指定操作的集合名称。
@MongoId
- 修饰范围:用在成员变量、方法上。
- 作用:用来将成员变量的值映射为文档的 _id 的值。
@Field
- 修饰范围:用在成员变量、方法上。
- 作用:用来将成员变量及其值映射为文档中一个 key:value 对。
- 属性:(name , value) 用来指定在文档中 key 的名称,默认为成员变量名。
@Transient
- 修饰范围:用在成员变量、方法上。
- 作用:用来指定此成员变量不参与文档的序列化。
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document("user")
public class User {
@MongoId
private Integer uid;
@Field
private String name;
@Field
private String password;
@Field
private Integer age;
}
3.2 添加文档
insert 方法返回值是新增的 Document 对象,里面包含了新增后 id 的值。如果集合不存在会自动创建集合。
@Test
public void test1() {
// _id存在时更新数据
mongoTemplate.save(new User(1, "aaa", "123456", 20));
// _id存在时抛出异常
mongoTemplate.insert(new User(2, "bbb", "113456", 21));
List<User> list = Arrays.asList(
new User(3, "ccc", "124266", 22),
new User(4, "ddd", "136521", 23),
new User(5, "eee", "147258", 24));
// 批量插入
mongoTemplate.insert(list, User.class);
}
通过 Spring Data MongoDB 还会给集合中多加一个 _class
的属性,存储新增时 Document 对应 Java 中类的全限定路径。这么做为了查询时能把 Document 转换为 Java 类型。
3.3 查询文档
Query
类作为查询条件的容器,用于放置 Criteria 条件接口。Criteria
是标准查询的接口,可以引用静态的Criteria.where()
将字段和条件组合在一起进行查询。
@Test
public void test1() {
System.out.println("==========查询所有文档===========");
List<User> list = mongoTemplate.findAll(User.class);
list.forEach(System.out::println);
System.out.println("==========根据_id查询===========");
User user = mongoTemplate.findById(3, User.class);
System.out.println(user);
System.out.println("==========findOne返回第一个文档===========");
User one = mongoTemplate.findOne(new Query(), User.class);
System.out.println(one);
}
@Test
public void test2() {
System.out.println("==========条件查询===========");
// 查询name为"eee"的用户
Query query1 = new Query(Criteria.where("name").is("eee"));
// 查询 age<23 的用户
Query query2 = new Query(Criteria.where("age").lt(23));
// 查询 21<=age<24 的用户
Query query3 = new Query(Criteria.where("age").gte(21).lt(24));
// 模糊查询
Query query4 = new Query(Criteria.where("password").regex("123"));
System.out.println("==========多条件查询===========");
// 查询 age<24 且 密码包含"123" 的用户
Criteria criteria1 = new Criteria();
criteria1.andOperator(Criteria.where("age").lt(24), Criteria.where("password").regex("123"));
Query query5 = new Query(criteria1);
// 查询 age>23 或 密码包含"456" 的用户
Criteria criteria2 = new Criteria();
criteria2.orOperator(Criteria.where("age").gt(23), Criteria.where("password").regex("456"));
Query query6 = new Query(criteria2);
List<User> list = mongoTemplate.find(query6, User.class);
list.forEach(System.out::println);
}
@Test
public void test3() {
System.out.println("==========排序===========");
Query query1 = new Query();
query1.with(Sort.by(Sort.Order