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了:
相关文章
|
9月前
|
SpringCloudAlibaba Java Nacos
SpringCloud概述
Spring Cloud是Spring推出的微服务统一解决方案,弥补了各技术分散的不足,具备约定优于配置、组件丰富、开箱即用等特点。通过伦敦地铁站命名版本,避免与子项目版本冲突。Spring Cloud Alibaba融合阿里开源组件(如Nacos、Sentinel、Seata等),提供完整微服务生态,因Netflix组件停更,现成为主流选择。本节介绍其诞生背景、版本机制及技术体系,为后续实战奠定基础。
|
9月前
|
JSON API 数据库
如何写好一篇技术方案
本模板用于规范产品需求文档,涵盖项目背景、变更记录、功能模块、流程图、API设计等内容,支持语雀卡片与文件附件,提升团队协作效率。
|
9月前
|
容灾 关系型数据库 Nacos
Seata的部署和集成
本文介绍Seata分布式事务TC服务的部署与微服务集成步骤。包括下载、配置、数据库表初始化,通过Nacos实现配置共享与注册,搭建高可用集群,并实现异地容灾。微服务通过统一配置中心动态映射事务组,提升系统灵活性与可靠性。(239字)
|
9月前
|
存储 JSON NoSQL
MongoDB常用命令
本文介绍如何使用MongoDB存储文章评论数据,涵盖数据库与集合的创建、增删改查操作及分页排序查询。通过实例演示文档的插入、更新、删除与条件查询,并讲解注意事项如_id主键、数据类型及命名规范,帮助快速掌握MongoDB基本操作。
|
9月前
|
存储 NoSQL 关系型数据库
MongoDB索引知识
MongoDB索引通过B树结构提升查询效率,避免全表扫描。支持单字段、复合、地理空间、文本及哈希索引,优化相等匹配、范围查询、排序与全文搜索,显著提升大数据量下的查询性能。
|
9月前
|
运维 安全 Devops
生产环境缺陷管理
git-poison基于go-git实现分布式bug追溯,解决多分支开发中bug漏修、漏发等问题。通过“投毒-解毒-银针”机制,自动化管理bug生命周期,降低协同成本,避免人为失误,已在大型团队落地应用,显著提升发布安全与效率。
|
9月前
|
SQL 运维 分布式计算
如何做好SQL质量监控
SLS推出用户级SQL质量监控功能,集成于CloudLens for SLS,提供健康分、服务指标、运行明细、SQL Pattern分析及优化建议五大维度,助力用户全面掌握SQL使用情况,实现精细化管理与性能优化,提升日志分析效率与体验。
|
9月前
|
存储 安全 Java
Java泛型类型擦除以及类型擦除带来的问题
Java泛型在编译时会进行类型擦除,所有泛型信息被移除,替换为原始类型(如Object或限定类型)。例如,List<String>和List<Integer>在运行时均为List,导致无法通过instanceof判断泛型类型。类型擦除带来诸多问题:反射可绕过泛型限制;静态成员不能使用类的泛型参数;基本类型不能作为泛型参数(需用包装类);多态重写因擦除产生桥方法来解决冲突。尽管类型被擦除,编译器仍自动插入强制转换保证类型安全。
|
9月前
|
监控 算法 Unix
Thread.sleep(0) 到底有什么用(读完就懂)
Thread.Sleep用于让线程暂停执行一段时间,不参与CPU竞争。Sleep(1000)并不保证精确唤醒时间,因系统调度受优先级和竞争影响;而Sleep(0)会触发立即重新计算各线程优先级,促使CPU切换,避免线程长时间占用导致界面假死。正确理解其原理有助于优化多线程程序性能与响应性。
|
9月前
|
存储 NoSQL 关系型数据库
MongoDB相关概念
MongoDB是一款高性能、无模式的文档型数据库,适用于高并发、海量数据、高扩展性场景。广泛应用于社交、游戏、物流、物联网及视频直播等领域,擅长处理数据量大、读写频繁、事务要求不高的业务。支持灵活的JSON-like文档结构、丰富查询、分布式架构与多区域分片,相比MySQL可大幅降低开发运维成本,是Web2.0时代大数据存储的理想选择。(238字)

热门文章

最新文章