一、前言
一般SpringBoot集成Mongodb有以下两种使用方法:
- 类似 JPA 的用法
- 使用 MongoTemplate调用 API
这里使用 MongoTemplate来操作 Mongodb
二、环境搭建
2.1 导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2.2 yml配置文件
spring:
data:
mongodb:
host: 127.0.0.1
database: articledb
port: 27017
这里使用的是本地的 Mongodb 的 articledb 数据库,端口不填的话默认也为 27017
2.3 集合结构及实体类
新增数据脚本:
db.comment.insert({"_id":"1","articleid":"100000","content":"今天天气真好","userid":"1001","nickname":"Rose","createdatetime":new Date(),"likenum":NumberInt(10),"replynum":NumberInt(0),"state":"1","parentid":"0"})
集合结构:
实体类:
@Document
@Data
@EqualsAndHashCode
public class Comment {
// 主键
@Id
private String id;
//吐槽内容
private String content;
//发布人ID
private String userid;
//昵称
private String nickname;
//评论的日期时间
private LocalDateTime createdatetime;
//点赞数
private Integer likenum;
//回复数
private Integer replynum;
//状态
private String state;
//上级ID
private String parentid;
//文章id
private String articleid;
}
其他常用注解
注解在类上:
@Document(collection = "comment")//可以省略,如果省略,则默认使用类名小写映射集合
//复合索引
@CompoundIndex(def = "{'userid': 1, 'nickname': -1}")
注解在字段上:
//该属性对应mongodb的字段的名字,如果一致,则无需该注解
//吐槽内容
@Field("content")
private String content;
//添加一个单字段的索引
//发布人ID
@Indexed
private String userid;
三、API
3.1 新增
举例:
@Test
public void testAdd(){
Comment comment=new Comment();
comment.setId("3");
comment.setArticleid("100001");
comment.setContent("测试添加的数据");
comment.setCreatedatetime(LocalDateTime.now());
comment.setUserid("1003");
comment.setNickname("凯撒大帝");
comment.setState("1");
comment.setLikenum(0);
comment.setReplynum(0);
comment.setParentid("0");
mongoTemplate.save(comment,"comment");
}
3.2 删除
格式:
MongodbTemplage.remove(Query query, Class<?> entityClass)
MongodbTemplage.remove(Query query, Class<?> entityClass, String collectionName)
参数解释:
Query query:传入的查询条件,按此条件进行删除
Class<?> entityClass:所删除的数据的实体类
还可以带上参数
String collectionName : 这是集合的名称
如果条件多,可这样 and() 和 andOperator()
new Query(Criteria.where(“要查询的属性”).is(“属性值”).and(“要查询的属性”).is(“属性值”))
或者
new Query(Criteria.where(“要查询的属性”).is(“属性值”).andOperator(Criteria.where(“要查询的属性”).is(“属性值”)));
一个Criteria中只能有一个andOperator,and可以多个,我们查询并列条件时,比较建议使用and方法。
举例:
@Test
public void testDel(){
Criteria criteria = Criteria.where("_id").is("3");
Query query = Query.query(criteria);
mongoTemplate.remove(query,Comment.class,"comment");
}
3.3 修改
MongodbTemplage.updateMulti(Query var1, Update var2, Class<?> var3)
MongodbTemplage.updateFirst(Query var1, Update var2, Class<?> var3)
两个不同点之处,是updateFirst只修改查到的第一个。
参数解释:
Query var1 :同上
Update var2 : 修改数据,或者说修改属性值
Class<?> var3 : 所对应的实体类。
举例:
@Test
public void testUpdate(){
Criteria criteria = Criteria.where("_id").is("2");
Query query = Query.query(criteria);
Update update = new Update().set("content","测试修改评论");
mongoTemplate.updateMulti(query,update,Comment.class,"comment");
}
3.4 查询
3.4.1 查询所有
@Test
public void testFindAll(){
List<Comment> list = mongoTemplate.findAll(Comment.class,"comment");
for (Comment comment : list) {
System.out.println(comment);
}
}
3.4.2 条件查询
@Test
public void testFindWhere(){
Criteria criteria = Criteria.where("articleid").is("100000").and("userid").is("1002");
Query query = Query.query(criteria);
List<Comment> list = mongoTemplate.find(query, Comment.class, "comment");
for (Comment comment : list) {
System.out.println(comment);
}
}
3.4.3 带 or 条件的查询
@Test
public void testFindOr(){
// likenum <= 5
Criteria criteria1 = Criteria.where("likenum").is(5);
// likenum >= 10
Criteria criteria2 = Criteria.where("likenum").is(10);
// likenum <= 5 OR likenum >= 10
Criteria criteria = new Criteria();
Query query = Query.query(criteria.orOperator(criteria1,criteria2));
List<Comment> list = mongoTemplate.find(query, Comment.class, "comment");
for (Comment comment : list) {
System.out.println(comment);
}
}
3.4.4 排序查询
@Test
public void testOrder() {
Query query = new Query();
query.with(new Sort(Sort.Direction.DESC, "userid"));
List<Comment> list = mongoTemplate.find(query, Comment.class);
for (Comment comment : list) {
System.out.println(comment);
}
}
3.4.5 分页查询
@Test
public void testPage() {
Query query = new Query();
query.skip(1).limit(1);
List<Comment> list = mongoTemplate.find(query, Comment.class);
for (Comment comment : list) {
System.out.println(comment);
}
}
3.4.6 模糊查询
@Test
public void testLike() {
System.out.println(mongoTemplate.find(Query.query(Criteria.where("content").regex("天气")), Comment.class));
}