MongoDB实战演练

简介: 本项目基于SpringDataMongoDB实现头条文章评论功能,涵盖增删改查、按文章ID查询、分页查询及点赞功能。通过MongoTemplate优化点赞操作,提升性能,并使用@Indexed和@CompoundIndex注解创建索引,提高查询效率。

5.1 需求分析
某头条的文章评论业务如下:
需要实现以下功能:
1)基本增删改查API
2)根据文章id查询评论
3)评论点赞
5.2 表结构分析
数据库:articledb
5.3 技术选型
5.3.1 mongodb-driver(了解)
mongodb-driver是mongo官方推出的java连接mongoDB的驱动包,相当于JDBC驱动。我们通过一个入门的案例来了解mongodb-driver的基本使用。
官方驱动说明和下载:链接 ,官方驱动示例文档:链接。
5.3.2 SpringDataMongoDB
SpringData家族成员之一,用于操作MongoDB的持久层框架,封装了底层的mongodb-driver。
官网主页: https://projects.spring.io/spring-data-mongodb/
5.4 文章微服务模块搭建
(1)搭建项目工程article,pom.xml引入依赖:
(2)创建application.yml
(3)创建启动类
cn.itcast.article.ArticleApplication
(4)启动项目,看是否能正常启动,控制台没有错误。
5.5 文章评论实体类的编写
创建实体类 创建包cn.itcast.article,包下建包po用于存放实体类,创建实体类
cn.itcast.article.po.Comment
说明:
索引可以大大提升查询效率,一般在查询字段上添加索引,索引的添加可以通过Mongo的命令来添加,也可以在Java的实体类中通过注解添加。
1)单字段索引注解@Indexed
org.springframework.data.mongodb.core.index.Indexed.class
声明该字段需要索引,建索引可以大大的提高查询效率。
Mongo命令参考:
db.comment.createIndex({"userid":1})
2)复合索引注解@CompoundIndex
org.springframework.data.mongodb.core.index.CompoundIndex.class
复合索引的声明,建复合索引可以有效地提高多字段的查询效率。
Mongo命令参考:
db.comment.createIndex({"userid":1,"nickname":-1})
5.6 文章评论的基本增删改查
(1)创建数据访问接口 cn.itcast.article包下创建dao包,包下创建接口
cn.itcast.article.dao.CommentRepository
(2)创建业务逻辑类 cn.itcast.article包下创建service包,包下创建类
cn.itcast.article.service.CommentService
(3)新建Junit测试类,测试保存和查询所有:
cn.itcast.article.service.CommentServiceTest
添加结果:
5.7 根据上级ID查询文章评论的分页列表
(1)CommentRepository新增方法定义
(2)CommentService新增方法
(3)junit测试用例:
cn.itcast.article.service.CommentServiceTest
(4)测试
使用compass快速插入一条测试数据,数据的内容是对3号评论内容进行评论。
执行测试,结果:
----总记录数:1
----当前页数据:[Comment{id='33', content='你年轻,火力大', publishtime=null, userid='1003', nickname='凯撒大帝', createdatetime=null, likenum=null, replynum=null, state='null', parentid='3', articleid='100001'}]
5.8 MongoTemplate实现评论点赞
我们看一下以下点赞的临时示例代码: CommentService 新增updateThumbup方法
Java
运行代码
复制代码
1
2
3
4
5
6
7
8
9
/**

  • 点赞-效率低
  • @param id
    */
    public void updateCommentThumbupToIncrementingOld(String id){
    Comment comment = CommentRepository.findById(id).get();
    comment.setLikenum(comment.getLikenum()+1);
    CommentRepository.save(comment);
    }
    以上方法虽然实现起来比较简单,但是执行效率并不高,因为我只需要将点赞数加1就可以了,没必要查询出所有字段修改后再更新所有字段。我们可以使用MongoTemplate类来实现对某列的操作。
    (1)修改CommentService
    Java
    运行代码
    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    //注入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");
    }
    (2)测试用例:
    cn.itcast.article.service.CommentServiceTest
    Java
    运行代码
    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    /*
  • 点赞数+1
    */
    @Test
    public void testUpdateCommentLikenum(){
    //对3号文档的点赞数+1
    commentService.updateCommentLikenum("3");
    }
    执行测试用例后,发现点赞数+1了:
相关文章
|
5月前
|
SpringCloudAlibaba Java Nacos
SpringCloud概述
Spring Cloud是Spring推出的微服务统一解决方案,弥补了各技术分散的不足,具备约定优于配置、组件丰富、开箱即用等特点。通过伦敦地铁站命名版本,避免与子项目版本冲突。Spring Cloud Alibaba融合阿里开源组件(如Nacos、Sentinel、Seata等),提供完整微服务生态,因Netflix组件停更,现成为主流选择。本节介绍其诞生背景、版本机制及技术体系,为后续实战奠定基础。
|
5月前
|
容灾 关系型数据库 Nacos
Seata的部署和集成
本文介绍Seata分布式事务TC服务的部署与微服务集成步骤。包括下载、配置、数据库表初始化,通过Nacos实现配置共享与注册,搭建高可用集群,并实现异地容灾。微服务通过统一配置中心动态映射事务组,提升系统灵活性与可靠性。(239字)
|
5月前
|
JSON 自然语言处理 数据库
索引库、文档操作
本文介绍了Elasticsearch的核心概念及其与MySQL的对比,涵盖索引、映射、文档等结构,详细讲解了索引库和文档的增删改查操作,并结合Kibana与Java RestClient实现创建、查询、删除索引及批量导入数据,帮助读者掌握ES基础操作与实际应用。
|
5月前
|
安全 Java 数据安全/隐私保护
通用权限管理模型
本文介绍了ACL、RBAC等常见权限管理模型。ACL通过用户/角色与权限直接关联,实现简单;RBAC则基于角色授权,解耦用户与权限,更易维护。RBAC分为RBAC0至RBAC3,逐步引入角色继承与职责分离,提升安全性与灵活性。了解模型有助于构建系统权限体系。
|
5月前
|
安全 Java 应用服务中间件
实现权限管理的技术
权限管理技术选型需综合考量。主流方案如Apache Shiro配置简单但安全性弱;Spring Security功能强大但较复杂;自定义ACL契合项目但维护成本高。多数工具基于ACL或RBAC模型封装,应根据项目实际选择最合适的方案。
|
5月前
|
安全 Java 数据安全/隐私保护
认识SpringSecurity
SpringSecurity是Java生态中主流的权限管理框架,核心功能包括认证、鉴权及安全防护。支持表单、OAuth2、JWT等多种认证方式,提供URL级、方法级鉴权,支持RBAC、SPEL表达式控制,并具备CSRF等攻击防御能力。其架构基于过滤器链,通过FilterChainProxy实现多安全过滤链,灵活处理安全异常,保障系统安全。
|
5月前
|
安全 Cloud Native Java
工程搭建与验证
本文介绍如何基于阿里云脚手架快速搭建Spring Boot工程,并整合Spring Security。内容涵盖项目初始化、代码导入与验证、引入Web及Security依赖、登录认证测试,默认账号密码获取,以及通过GitHub获取完整代码(分支:Day01-整合SpringBoot与SpringSecurity),助力快速入门云原生应用开发。
|
5月前
|
存储 监控 Docker
ElasticSearch集群
Elasticsearch集群通过分片与副本机制解决海量数据存储及单点故障问题。将索引拆分为多个shard分布于不同节点,提升存储与性能;通过replica实现数据高可用。利用docker部署多节点集群,结合cerebro监控状态,支持分片管理、故障转移与脑裂防护,确保集群稳定可靠运行。(238字)
|
5月前
|
Kubernetes IDE Java
部署篇(工具部署)
本文介绍EDAS在Kubernetes上部署SpringCloud应用的多场景工具体系,涵盖IDE、Maven插件、CI/CD、Terraform和CLI五种部署方式,覆盖开发至运维全链路,提升部署效率与安全性,并预告后续将聚焦“可灰度、可回滚、可监控”的线上变更实践。
|
5月前
|
JSON 缓存 前端开发
什么是跨域
CORS(跨域资源共享)是W3C标准,允许浏览器向跨源服务器发送XMLHttpRequest请求,突破AJAX同源限制。需浏览器和服务器共同支持,现代浏览器均已兼容。通信过程由浏览器自动处理,开发者无需特殊编码。核心在于服务器需实现CORS接口,通过设置如Access-Control-Allow-Origin等响应头,控制跨域权限。分为简单请求与非简单请求,后者会先发起OPTIONS预检。相比仅支持GET的JSONP,CORS支持所有HTTP方法,更灵活安全。

热门文章

最新文章