【探花交友】day03—MongoDB基础(五)

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 【探花交友】day03—MongoDB基础(五)

5、今日佳人

在用户登录成功后,就会进入首页,首页中有今日佳人、推荐好友、探花、搜附近等功能。

今日佳人,会推荐缘分值最大的用户,进行展现出来。缘分值的计算是由用户的行为进行打分,如:点击、点赞、评论、学历、婚姻状态等信息组合而成的。

实现:我们先不考虑推荐的逻辑,假设现在已经有推荐的结果,我们只需要从结果中查询到缘分值最高的用户就可以了。至于推荐的逻辑以及实现,我们将后面的课程中讲解。

流程:

5.1、表结构设计

1. #表结构  recommend_user
2. {
3. "userId":1001,  #推荐的用户id
4. "toUserId":1002, #用户id
5. "score":90,  #推荐得分
6. "date":"2019/1/1" #日期
7. }

在MongoDB中只存储用户的id数据,其他的数据需要通过接口查询。

5.2、服务提供者

5.2.0、导入依赖

找到tanhua-domain模块的pom.xml打开mongo的依赖

5.2.1、实体类

1. @AllArgsConstructor
2. @NoArgsConstructor
3. @Data
4. @Document(collection = "recommend_user")
5. public class RecommendUser implements java.io.Serializable {
6. private ObjectId id; //主键id
7. private Long userId; //推荐的用户id
8. private Long toUserId; //用户id
9. private Double score =0d; //推荐得分
10. private String date; //日期
11. }

5.2.2、RecommendUserApi接口

1. public interface RecommendUserApi {
2. 
3.     RecommendUser queryWithMaxScore(Long toUserId);
4. }

5.2.3、RecommendUserApiImpl

1. @DubboService
2. public class RecommendUserApiImpl  implements RecommendUserApi {
3. 
4. @Autowired
5. private MongoTemplate mongoTemplate;
6. 
7. //查询今日佳人
8. public RecommendUser queryWithMaxScore(Long toUserId) {
9. 
10. //根据toUserId查询,根据评分score排序,获取第一条
11. //构建Criteria
12. Criteria criteria = Criteria.where("toUserId").is(toUserId);
13. //构建Query对象
14. Query query = Query.query(criteria).with(Sort.by(Sort.Order.desc("score")))
15.                 .limit(1);
16. //调用mongoTemplate查询
17. 
18. return mongoTemplate.findOne(query,RecommendUser.class);
19.     }
20. }

5.2.4、application配置

1. server:
2.   port: 18082
3. spring:
4.   application:
5.     name: tanhua-dubbo-mongo
6.   cloud:
7.     nacos:
8.       discovery:
9.         server-addr: 192.168.136.160:8848
10.   data:
11.     mongodb:
12.       uri: mongodb://192.168.136.160:27017/tanhua        
13. dubbo:
14.   protocol:
15.     name: dubbo
16.     port: 20882
17.   registry:
18.     address: spring-cloud://localhost
19.   scan:
20.     base-packages: com.tanhua.dubbo.api  #dubbo中包扫描

5.2.5 启动类

1. package com.tanhua.dubbo;
2. 
3. import com.baomidou.mybatisplus.annotation.DbType;
4. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
5. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
6. import org.mybatis.spring.annotation.MapperScan;
7. import org.springframework.boot.SpringApplication;
8. import org.springframework.boot.autoconfigure.SpringBootApplication;
9. import org.springframework.context.annotation.Bean;
10. 
11. @SpringBootApplication
12. public class DubboMongoApplication {
13. 
14. public static void main(String[] args) {
15.         SpringApplication.run(DubboMongoApplication.class,args);
16.     }
17. }

5.3、代码实现

5.3.1、接口说明

地址:http://192.168.136.160:3000/project/19/interface/api/100

5.3.2、TanhuaController

1. @RestController
2. @RequestMapping("/tanhua")
3. public class TanhuaController {
4. 
5. @Autowired
6. private TanhuaService tanhuaService;
7. 
8. //今日佳人
9. @GetMapping("/todayBest")
10. public ResponseEntity todayBest() {
11. TodayBest vo = tanhuaService.todayBest();
12. return ResponseEntity.ok(vo);
13.     }
14. }

5.3.3、TanhuaService

1. @Service
2. public class TanhuaService {
3. 
4. @DubboReference
5. private RecommendUserApi recommendUserApi;
6. 
7. @DubboReference
8. private UserInfoApi userInfoApi;
9. 
10. @DubboReference
11. private QuestionApi questionApi;
12. 
13. @Autowired
14. private HuanXinTemplate template;
15. 
16. //查询今日佳人数据
17. public TodayBest todayBest() {
18. //1、获取用户id
19. Long userId = UserHolder.getUserId();
20. //2、调用API查询
21. RecommendUser recommendUser = recommendUserApi.queryWithMaxScore(userId);
22. if(recommendUser == null) {
23.             recommendUser = new RecommendUser();
24.             recommendUser.setUserId(1l);
25.             recommendUser.setScore(99d);
26.         }
27. //3、将RecommendUser转化为TodayBest对象
28. UserInfo userInfo = userInfoApi.findById(recommendUser.getUserId());
29. TodayBest vo = TodayBest.init(userInfo, recommendUser);
30. //4、返回
31. return vo;
32.     }
33. }

5.3.4、vo对象

1. package com.tanhua.domain.vo;
2. 
3. import com.tanhua.domain.db.UserInfo;
4. import com.tanhua.domain.mongo.RecommendUser;
5. import lombok.AllArgsConstructor;
6. import lombok.Data;
7. import lombok.NoArgsConstructor;
8. import org.springframework.beans.BeanUtils;
9. 
10. /**
11.  * 今日佳人
12.  */
13. @Data
14. @NoArgsConstructor
15. @AllArgsConstructor
16. public class TodayBest {
17. 
18. private Long id; //用户id
19. private String avatar;
20. private String nickname;
21. private String gender; //性别 man woman
22. private Integer age;
23. private String[] tags;
24. private Long fateValue; //缘分值
25. 
26. /**
27.      * 在vo对象中,补充一个工具方法,封装转化过程
28.      */
29. public static TodayBest init(UserInfo userInfo, RecommendUser recommendUser) {
30. TodayBest vo = new TodayBest();
31.         BeanUtils.copyProperties(userInfo,vo);
32. if(userInfo.getTags() != null) {
33.             vo.setTags(userInfo.getTags().split(","));
34.         }
35.         vo.setFateValue(recommendUser.getScore().longValue());
36. return vo;
37.     }
38. }

5.3.5、解决MongoDB启动bug

在项目中,添加了mongo的依赖的话,springboot就会自动去连接本地的mongo,由于他连接不上会导致出错。

解决有2种方案:

  • 排除掉mongo的依赖
  • springboot中添加排除自动配置的注解
1. package com.tanhua.server;
2. 
3. import org.springframework.boot.SpringApplication;
4. import org.springframework.boot.autoconfigure.SpringBootApplication;
5. import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
6. import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
7. 
8. @SpringBootApplication(exclude = {
9.         MongoAutoConfiguration.class,
10.         MongoDataAutoConfiguration.class
11. }) //排除mongo的自动配置
12. public class TanhuaServerApplication {
13. 
14. public static void main(String[] args) {
15.         SpringApplication.run(TanhuaServerApplication.class,args);
16.     }
17. }

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
NoSQL API MongoDB
【探花交友】day03—MongoDB基础(四)
【探花交友】day03—MongoDB基础(四)
85 0
|
存储 SQL JSON
【探花交友】day03—MongoDB基础(三)
【探花交友】day03—MongoDB基础(三)
105 0
|
存储 NoSQL Java
【探花交友】day03—MongoDB基础(二)
【探花交友】day03—MongoDB基础(二)
105 0
|
NoSQL Java API
【探花交友】day03—MongoDB基础(一)
【探花交友】day03—MongoDB基础
107 0
|
存储 SQL NoSQL
【探花交友】学习MongoDB快速入门上手
【探花交友】学习MongoDB快速入门上手
101 0
【探花交友】学习MongoDB快速入门上手
|
2月前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
8天前
|
存储 JSON NoSQL
学习 MongoDB:打开强大的数据库技术大门
MongoDB 是一个基于分布式文件存储的文档数据库,由 C++ 编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它与 MySQL 类似,但使用文档结构而非表结构。核心概念包括:数据库(Database)、集合(Collection)、文档(Document)和字段(Field)。MongoDB 使用 BSON 格式存储数据,支持多种数据类型,如字符串、整数、数组等,并通过二进制编码实现高效存储和传输。BSON 文档结构类似 JSON,但更紧凑,适合网络传输。
39 15
|
16天前
|
存储 NoSQL 关系型数据库
阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板
我们的风控系统引入阿里云数据库MongoDB版后,解决了特征类字段灵活加减的问题,大大提高了开发效率,极大的提升了业务用户体验,获得了非常好的效果
阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板
|
1月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
2月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。