开发者学堂课程【MongoDB精讲课程(上):Mongo Template 实现评论点赞】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/726/detail/12970
Mongo Template 实现评论点赞
内容介绍:评论点赞业务较为简单,当我们点击用户评论边的图标,即可使评论数加一。实现评论点赞有两种方式
一、 第一种方式
1、实现评论点赞首先根据 ID 把评论查出,查出之后根据代码
comment.setLikenum(comment.getLikenum()+1);
//把点赞数加一
CommentRepository.save(comment)
//把加完一的数据在做一次保存,实际上,做了两次数据库操作。
2、它的缺点是 IO 次数增加了,效率变低。如果数据量不大,这种性能损耗可以忽略不计,往往用 MongoDB 都是因为大变发的情况下,但一点的性能损耗都是对系统很大的损害。
3、我们看一下以下点赞的临时示例代码: CommentService 新增 updateThumbup 方法
/**
*点赞-效率低
*@param id
*/
Public void updateCommentThumbupToIncrementingold
(String id){
Comment comment=CommentRepository.findById(id). get();
comment.setLikenum(comment.getLikenum()+1);
CommentRepository, save(comment);
}
以上方法虽然实现起来比较简单,但是执行效率并不高,因为我只需要将点赞数加1就可以了,没必要查询出所有字段修改后再更新所有字段。(蝴蝶效应)
二、第二种方式
1、有一种方法直接执行一条文档更新的命令,就可以实现点赞数的加一,或找到列值增长的修改,直接执行 $inc 这个指令。
想实现比较复杂的指令的查询或命令行的更新之类,需要用到SpringDataMongoDB 提供的 MongoTemplate 模板,这个模板里面提供 update 方法,可以完成一些复杂的更新。
2、实现Mongo Template
(1)首先找到 Servies 方法,注入Mongo Template(private MongoTemplate mongoTemplate),使用要定义一个新的方法,完成点赞数的加一。复制 public void updateCommentLikenum(String id){,方法叫做 updateCommentLikenum,即更新评论的点赞数。
(2)Mongo Template 里面有update 方法,Update 方法有多种,例如updateFirst 、updateMulti 等。
First和 Multi 在之前的更新操作学习过,更新的时候可以带可选项,带上 Multi 更新多个文档 ,不带是更新 updateFirst。
First和 Multi 的底层是 Mongo 的命令行,一般情况下用 updateFirst。
(3)updateFirst 里面有三个参数,首先是查询条件,更新条件,其次是需要更新的集合。
更新的集合有两种写法,首先有 query 和 update ,更新的集合名称有字符串或实体类的 class 。主要的两个参数一个是查询条件,一个是更新条件。
//查询条件
Query query = Query. query(Criteria, where(" _id"), is(id));
// 更新条件
Update update = new Update();
update. Inc ( key. “likenum”);
//inc 对应列值增长的指令集,这里面可以带一个参数,给 MongoDB 哪个资料做增长,后面如果在加一个参数 Number 类型,也可以做一个步长,跟 MongoDB 命令的方式一样(db.comment.update({_id:”3”},{$inc:{likenum:NumberInt(1)}})
mongoTemplate. updateFirst (query. update.Commen. class);
实验更新是否成功需要写一个 Test 方法,复制
public void testUpdateCommendLikenum()
调用 commentService.updateCommendLikenum();
注意:测试的方法不可以加参数
3、检测结果
运行结果控制台没有报错,刷新发现点赞数加一。这种操作的好处是只执行了一次 Mongo DB 的数据库操作,性能比第一种方式高,相当于减少了一次 IO 的操作。