MongoDB基本使用
Pom.xml
<!--MongoDB 非Spring boot 项目使用-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>3.0.6.RELEASE</version>
</dependency>
<!--MongoDB Spring boot 项目使用-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
Annotation
- @Document
– collection: 指定被操作的集合名称
1.1Eg: @Document(collection = “ap_user_search”)- @Id: 声明当前pojo成员属性为主键, 若不赋值, 则MongoDB自动生成UUID
- @Field
– value: 指定pojo成员属性对应MongoDB中的字段名, 与MyBatis Plus中的@Field用法一致
3.1 Eg: @Field(“user_id”)
yaml
spring:
# MongoDB 连接参数
data:
mongodb:
host: 39.108.135.173
port: 27017
database: leadnews-search
Api 及 Class
- Class:
– public class MongoTemplate implements MongoOperations, ApplicationContextAware, IndexOperationsProvider
1.1 用于调用CRUD方法的类
– public class Query
1.2 条件类
– public class PageRequest extends AbstractPageRequest
1.3 分页查询的类
– public class Sort implements Streamable<Sort.Order>, Serializable
1.4 排序查询的类
– public static enum Direction: 指定排序类型的常量类- Api
– public T insert(T objectToSave): 新增操作
– public T save(T objectToSave): 新增 / 修改 操作
– public static Query query(CriteriaDefinition criteriaDefinition): 定义条件
– public class Criteria implements CriteriaDefinition: 配合query使用
– public static Criteria where(String key): 设定指定查询的字段
– public Criteria is(@Nullable Object value): 指定一个值, 配合where使用
– public DeleteResult remove(Query query, Class<?> entityClass): 根据query条件删除
– public abstract long getDeletedCount(): 获取删除数据的条目
– public List find(Query query, Class entityClass): 根据query条件查询, 结果是一个List集合
– public T findOne(Query query, Class entityClass): 根据query条件查询, 结果是一个对象
– public T findById(Object id, Class entityClass): 根据Id查询, 结果是一个List集合
– public Criteria and(String key): 指定一个查询的字段, 并连接其它条件
– public Criteria regex(String regex): 模糊查询, 类似于like, 需要使用正则表达式作为模糊条件
– public Query limit(int limit): 指定查询的结果数据条目数, page默认为0, 第一页
– public Query with(Pageable pageable): 分页查询 或 排序查询必须使用到的方法
– public static PageRequest of(int page, int size): 分页查询, page从0开始, 页码要减1
– public static Sort by(Sort.Direction direction, String… properties): 根据指定的排序方式与字段作排序
Eg
新增
/**
* 新增
* @author 梦欣
*/
@Test
public void mongodbInsertTest(){
for (int i = 0; i < 7; i++) {
ApUserSearch apUserSearch = new ApUserSearch();
apUserSearch.setUserId(3);
apUserSearch.setKeyword("MengXin" + DateTime.now().getMillis());
apUserSearch.setCreatedTime(DateTime.now().toDate());
// 存入到MongoDB中
mongoTemplate.save(apUserSearch);
log.info("新增结果: {}", apUserSearch);
}
}
修改
/**
* 修改
* @author 梦欣
*/
@Test
public void mongodbUpdateTest(){
ApUserSearch apUserSearch = new ApUserSearch();
apUserSearch.setId("631f191059f48d416e285240");
apUserSearch.setUserId(3);
apUserSearch.setKeyword("执行了修改" + DateTime.now().getMillis());
apUserSearch.setCreatedTime(DateTime.now().toDate());
mongoTemplate.save(apUserSearch);
}
删除
/**
* 删除
* @author 梦欣
*/
@Test
public void mongodbRemoveTest(){
Query query = Query.query(Criteria.where("userId").is(3));
// remove: 根据条件删除指定集合中的数据
DeleteResult remove = mongoTemplate.remove(query, ApUserSearch.class);
// getDeletedCount: 删除的条目数量
log.info("删除userId 为 3 的结果: {}", remove.getDeletedCount());
}
条件查询
/**
* 根据UserId查询
* @author 梦欣
*/
@Test
public void mongodbFindTest(){
Query query = Query.query(Criteria.where("userId").is(3));
// find 查询的结果是一个集合, findOne 查询的结果是一个对象
List<ApUserSearch> apUserSearch = mongoTemplate.find(query, ApUserSearch.class);
log.info("查询UserId 为 3 的结果: {}", apUserSearch);
}
/**
* userId=9 且 keyword以"Xu"开头的记录
*/
@Test
public void mongodbQueryTest(){
// 设定条件: userId = 7 而且 keyword 以 Xu 开头
/*
* . 任意字符
* \d 数字
* [a-z] 小写字母
* [A-Z] 大写字母
* + 1个或多个
* * 0个或多个
* ? 0或1个
* {5} 5个
* {3,5} 3-5个
* ^ 以开头
* $ 以结束
*/
Query query = Query.query(Criteria.where("userId").is(9).and("keyword").regex("^Xu.*"));
List<ApUserSearch> apUserSearches = mongoTemplate.find(query, ApUserSearch.class);
log.info("userId=9 且 keyword以\"Xu\"开头的记录: {}", apUserSearches);
}
/**
* 分页查询
* @author 梦欣
*/
@Test
public void mongodbLimitTestOne(){
Query query = Query.query(Criteria.where("userId").is(7).and("keyword").regex(".*Meng.*"));
query.limit(7);
List<ApUserSearch> apUserSearches = mongoTemplate.find(query, ApUserSearch.class);
log.info("查询userId为7, 且keyword中包含Meng的结果, 只显示7条: {}",apUserSearches);
}
/**
* 翻页查询
* @author 梦欣
*/
@Test
public void mongodbLimitTestTwo(){
Query query = Query.query(Criteria.where("userId").in(3,7,9).and("keyword").regex(".*1.*"));
int page = 3;
int size = 7;
// page从0开始, 从第三页开始查询, 展示7条数据
query.with(PageRequest.of(page - 1,size));
List<ApUserSearch> apUserSearches = mongoTemplate.find(query, ApUserSearch.class);
log.info("查询userId为3,7,9, 且keyword中包含1的结果, 从第三页开始查询, 展示7条数据: {}",apUserSearches);
}
/**
* 排序
* @author 梦欣
*/
@Test
public void mongodbOrderTest(){
Query query = Query.query(Criteria.where("userId").in(3,7,9));
query.with(Sort.by(Sort.Direction.DESC,"createdTime"));
List<ApUserSearch> apUserSearches = mongoTemplate.find(query,ApUserSearch.class);
for (int i = 0; i < apUserSearches.size(); i++) {
log.info("时间倒序结果 {} :{}", i + 1, apUserSearches.get(i));
}
}