5-MongoDB实战演练

简介: 本课程以某头条文章评论业务为场景,基于MongoDB实战实现评论的增删改查、按文章ID查询、分页加载及点赞功能。采用SpringDataMongoDB与MongoTemplate优化数据操作,提升性能,并结合索引优化查询效率。

5-MongoDB实战演练

5.1 需求分析
某头条的文章评论业务如下:

早晨空腹喝水,是对还是错?

外从小喝凉水,冰水,也没见伤亡率就试我大天朝高多少?喝热水喝开水是当年我国建国初期

不少人认为,早起喝杯水,能够起到补水乃至减肥的作用.

生条件差,水不烧开了喝细菌多容易致病,而习惯性传下来喝开水而己,并不是什么别的原因

我们不应该把清晨浪费在手机上,健康很重要,杯温水幸福你我他

研究表明,刚烧开的水干万不能喝,因为烫嘴

我夏天空膜喝凉开水,冬天喝温开水

中间一条线两边是饭店17天前

我一直喝凉开水,冬天夏天都喝

厚德载物4426998517天有

|惊鸿照影|17天前

工人日报2019-08-0508:41:50

河畔半守护为伊人17天前

[捂脸[捂脸]岁月不饶人

专家说不能空腹吃饭

64条评论

FENGBETTA17天前

回复,5条回复V

你还年轻,火力旺.

回复收起回复人

TEAWEB17天前

南街村夫17天前

南街村夫17天前

写下您的评论..

查看更多评平论

12凸口

4仓回

4仓口

6凸回

8E

回复

回复

回复

评平论

回复

回复

2凸口

06

3F


需要实现以下功能:
1)基本增删改查API
2)根据文章id查询评论
3)评论点赞
5.2 表结构分析
数据库:articledb

:不可见;1:可见;

如果为0表示文章的顶级评论

评论的日期时间

MONGO的主键的字段

OBJECTLDSTRING

段名称

CREATEDATETIME

字段类型

评论人ID

字段含义

IKENUM

栏兰文章评论

ARTICLEID

点赞数

评论人呢称

COMMENT

REPYNUM

文章ID

STRING

ARENTIC

ICKNAME

NT32

备注

评论内容

ONTENT

回复数

上级ID

SERID

STRING

STRING

STATE

TRING

状态

INT32

STRING

STRING

DATE

1D

ID


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
添加结果:

CLASS:CN.ITCAST.ARTICLE.PO.COMMENT

CREATEDATETIME:2019-08-3103:23:40.921

ID:*1167639062832615424

CONTENT:"则试式添的好居

KNAME:凯大帝

ARTIC1EID:"1OEEOE

USERID:"1EE3

REPLYNUM:E

1IKENUM:E

STATE:1


5.7 根据上级ID查询文章评论的分页列表
(1)CommentRepository新增方法定义
(2)CommentService新增方法
(3)junit测试用例:
cn.itcast.article.service.CommentServiceTest
(4)测试
使用compass快速插入一条测试数据,数据的内容是对3号评论内容进行评论。

ARTLCLEDB.COMMENT

专家说不能空腹吃饭,响健康."

5D689257EDFC962DA8DD895E

"我一直喝凉开水,冬天夏天喝."

TICLEID:"100E81

INSERTDOCUMENT

INSERTDOCUMENT

NICKNAME:凯散..

CONTENT:你年全,.

NICKNAMESTRIR

OCUMENTSO

USERID:1OE3

建康.""1003"

DOCUMENTS

伊人焦摔"

AGGRES

PARENTID:3

CANCEL

STRING

IDMIXED

OFILTER

INSERT

COMMENT

STRING

STRING

"100001"

STRING

凯撒大帝"

100001"

杰克船长

号.""1004"

ROSE"

三LS

ID:"33"

STRING

STRING

3

2"


执行测试,结果:

----总记录数: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了:

CONTENT:"我一直喝凉开水,冬天粤天喝.

CREATEDATETIME:2019-08-0601:

ICKNAME:"杰克船长"

ARTIC1EID:"1EOE81

USERID:1EE4

1:05:06.321

1IKENUM:667

STATE:

ID:M3"


相关文章
|
机器学习/深度学习 人工智能 自动驾驶
深度学习-数据增强与扩充
深度学习-数据增强与扩充
|
机器学习/深度学习 PyTorch 算法框架/工具
【python-Unet】计算机视觉~舌象舌头图片分割~机器学习(三)
【python-Unet】计算机视觉~舌象舌头图片分割~机器学习(三)
1666 0
|
6月前
|
JSON 安全 机器人
钉钉通知
本文介绍如何通过Java代码调用钉钉机器人API实现系统告警消息推送。内容涵盖机器人创建、Webhook配置、Postman测试及Java代码实现,并提供限流策略与关键词安全设置等最佳实践,助力实时监控与异常通知。
|
6月前
|
消息中间件 运维 物联网
语音通知
语音通知服务适用于科技公司服务器或物联网设备异常时的告警通知。通过语音电话形式,向处理人播报预设模板内容,支持变量替换实现个性化提醒。需开通语音服务并申请资质、话术、号码及模板,可通过API发起呼叫并查询记录,支持主动查询与消息回执两种结果获取方式,提升运维响应效率。
语音通知
|
6月前
|
数据采集 领域建模 数据库
领域模型图(数据架构/ER图)
本文介绍如何通过四色原型法构建领域模型,并逐步推导出数据架构中的ER图。采用红色(时标性)、绿色(参与方-物品-地点)、黄色(角色)和蓝色(描述)四色模型,结合风控系统案例,详解从业务流程到实体关系图的建模过程,助力精准梳理数据结构。
 领域模型图(数据架构/ER图)
|
6月前
|
安全 Java 应用服务中间件
4.认识SpringSecurity
Spring Security 是 Spring 生态中的安全框架,提供认证、授权及安全防护功能。支持多种认证方式(如表单、OAuth2、JWT等),基于过滤器链实现请求控制,可防御 CSRF 等攻击,保障 Web 应用安全。
|
6月前
|
数据库
各种锁的专题
本文系统梳理了各类锁机制,涵盖轻量级锁、重量级锁、自旋锁、偏向锁,以及乐观锁与悲观锁的区别;详解读写锁、共享锁与排他锁的特性;介绍行锁、表锁、间隙锁等数据库锁类型,并探讨分布式锁的实现原理与应用场景。
|
人工智能 文字识别 数据挖掘
MarkItDown:微软开源的多格式转Markdown工具,支持将PDF、Word、图像和音频等文件转换为Markdown格式
MarkItDown 是微软开源的多功能文档转换工具,支持将 PDF、PPT、Word、Excel、图像、音频等多种格式的文件转换为 Markdown 格式,具备 OCR 文字识别、语音转文字和元数据提取等功能。
5082 9
MarkItDown:微软开源的多格式转Markdown工具,支持将PDF、Word、图像和音频等文件转换为Markdown格式
|
前端开发 Java 数据处理
BeanUtils.copyProperties的用法
BeanUtils.copyProperties的用法
|
Windows
【Windows】windows10 时间显示秒数
【Windows】windows10 时间显示秒数
840 0
【Windows】windows10 时间显示秒数

热门文章

最新文章