返回顶部

Mongodb 实现文章评论点赞

索引

  //查看索引
  db.collection.getIndexes()
  结果中显示的是默认 _id 索引。
   db.comment.getIndexes()
  [
    {
      "v" : 2,
      "key" : {
        "_id" : 1
      },
      "name" : "_id_",
      "ns" : "articledb.comment"
    }
  ]

  //创建索引,1 表示升序
   db.comment.createIndex({userid:1})
    {
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
    }

  //复合索引
  db.comment.createIndex({userid:1,nickname:-1})
    {
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 2,
    "numIndexesAfter" : 3,
    "ok" : 1
    }

  //删除 comment 集合中 userid 字段上的升序索引
   db.comment.dropIndex({userid:1})

  //删除所有索引
   db.comment.dropIndexes()
    {
    "nIndexesWas" : 2,
    "msg" : "non-_id indexes dropped for collection",
    "ok" : 1
    }

spring boot 使用 mongodb 实现文章评论功能

  • 引入依赖
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
  </dependency>

  • yml配置
  spring:
  #数据源配置
     data:
        mongodb:
  # 主机地址
           host: 127.0.0.1
  # 数据库
           database: articledb
  # 默认端口是27017
           port: 27017
  #也可以使用uri连接
  #uri: mongodb://127.0.0.1:27017/articledb
  • 实体类
  @Document(collection="comment")//可以省略,如果省略,则默认使用类名小写映射集合
  //复合索引
  // @CompoundIndex( def = "{'userid': 1, 'nickname': -1}")
  public class Comment implements Serializable {
  //主键标识,该属性的值会自动对应mongodb的主键字段"_id",如果该属性名就叫“id”,则该注解可以省略,否则必须写
    @Id
    private String id;//主键
    //该属性对应mongodb的字段的名字,如果一致,则无需该注解
    @Field("content")
    private String content;//吐槽内容
    private Date publishtime;//发布日期
    //添加了一个单字段的索引
    @Indexed
    private String userid;//发布人ID
    private String nickname;//昵称
    private LocalDateTime createdatetime;//评论的日期时间
    private Integer likenum;//点赞数
    private Integer replynum;//回复数
    private String state;//状态
    private String parentid;//上级ID
    private String articleid;

  • 数据访问接口,extends MongoRepository<Comment(实体类名),String(主键类型)>
  //评论的持久层接口
  public interface CommentRepository extends MongoRepository<Comment,String> {
  }
  • 业务层
  //评论的业务层
  @Service
  public class CommentService {
    //注入dao
    @Autowired
    private CommentRepository commentRepository;
    /**
    * 保存一个评论
    * @param comment
    */
    public void saveComment(Comment comment){
    //如果需要自定义主键,可以在这里指定主键;如果不指定主键,MongoDB会自动生成主键
    //设置一些默认初始值。。。
    //调用dao
    commentRepository.save(comment);
    }
    /**
    * 更新评论
    * @param comment
    */
    public void updateComment(Comment comment){
    //调用dao
    commentRepository.save(comment);
    }
    /**
    * 根据id删除评论
    * @param id
    */
    public void deleteCommentById(String id){
    //调用dao
    commentRepository.deleteById(id);
    }
    /**
    * 查询所有评论
    * @return
    */
    public List<Comment> findCommentList(){
    //调用dao
    return commentRepository.findAll();
    }
    /**
    * 根据id查询评论
    * @param id
    * @return
    */
    public Comment findCommentById(String id){
    //调用dao
    return commentRepository.findById(id).get();
    }
  }

  • 分页查询
  //CommentRepository新增方法定义,findByParentid 方法名有要求
  //根据父id,查询子评论的分页列表
  Page<Comment> findByParentid(String parentid, Pageable pageable);

  //CommentService新增方法
  /**
  * 根据父id查询分页列表
  */
  public Page<Comment> findCommentListPageByParentid(String parentid,int page ,int size){
  return commentRepository.findByParentid(parentid, PageRequest.of(page-1,size));
  }

  /**
  * 测试根据父id查询子评论的分页列表
  */
  @Test
  public void testFindCommentListPageByParentid(){
  Page<Comment> pageResponse = commentService.findCommentListPageByParentid("3", 1, 2);
    System.out.println("----总记录数:"+pageResponse.getTotalElements());
    System.out.println("----当前页数据:"+pageResponse.getContent());
  }

点赞

  • MongoTemplate实现评论点赞
  //修改CommentService
  //注入MongoTemplate
  @Autowired
  private MongoTemplate mongoTemplate;
  /**
  * 点赞数+1
  * @param id
  */
  public void updateCommentLikenum(String id){
  //查询对象
    Query query=Query.query(Criteria.where("_id").is(id));
    //更新对象
    Update update=new Update();
    //局部更新,相当于$set
    // update.set(key,value)
    //递增$inc
    // update.inc("likenum",1);
    update.inc("likenum");
    //参数1:查询对象
    //参数2:更新对象
    //参数3:集合的名字或实体类的类型Comment.class
    mongoTemplate.updateFirst(query,update,"comment");
  }
posted @ 2021-12-15 15:26  凑数的园丁  阅读(664)  评论(0编辑  收藏  举报