一、前言

一般SpringBoot集成Mongodb有以下两种使用方法:

  1. 类似 JPA 的用法
  2. 使用 MongoTemplate调用 API

这里使用 MongoTemplate来操作 Mongodb

二、环境搭建

2.1 导包

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  4. </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"})

集合结构:
image.png
实体类:

@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));
    }