【新时代圈友app】为什么要使用MongoDB数据库?— 查询缘分值最高的最佳好友并返回相关信息

news2024/9/23 19:22:09

目录

一、为什么要使用MongoDB数据库?

二、缘分值最佳好友

思路


一、为什么要使用MongoDB数据库?

本项目涉及到的圈子(动态)功能,用户会对朋友圈进行点赞、评论;那么随着用户的不断增多,评论点赞收藏等信息也会不断增多;相对来说用户对这些信息看的比较多,写比较少,也就是读多写少;且评论/点赞数等数据多一条少一条都没什么关系,没有什么影响,数据价值低;且后续还涉及到一个功能,附近人的展示,还会涉及到地理位置的相关数据;

所以综合以上,本项目涉及到对海量数据的处理,且读多写少,存储的数据价值低,且还需包括地理位置相关数据等;如果这个时候使用mysql或者redis的时候就不合适,无法高效的对海量数据进行处理,所有这里就用到了MongoDB数据库。

二、缘分值最佳好友

需求:根据缘分值最高的查询出最佳好友并返回相关信息

思路

第一步:通过令牌拦截器解析token获取到用户id;

@Service
public class TanhuaService {

    @DubboReference
    private RecommendUserApi recommendUserApi ;

    @DubboReference
    private UserInfoApi userInfoApi ;    

    //查询今日佳友数据
    public TodayBest todayBest() {
        //1、获取用户id
        Long userId = UserHeader.getUserId();
        //2、调用API查询
        RecommendUser recommendUser = recommendUserApi.queryWithMaxScore(userId);
        if (recommendUser == null){
            //没有好友,直接推荐一个用户为1的好友
            recommendUser = new RecommendUser();
            recommendUser.setUserId(1l);
            recommendUser.setScore(99d);
        }
        //3、将RecommendUser转化为TodayBest对象
        //查询出指定的用户对象
        UserInfo userInfo = userInfoApi.getById(recommendUser.getUserId());
        //数据封装
        TodayBest vo = TodayBest.init(userInfo,recommendUser);
        //4、返回
        return vo ;
    }

第二步:根据用户id去查询推荐好友表,将获的的推荐好友列表根据缘分值进行倒序排序,获取最高缘分值的一条数据作为今日最佳好友推荐。

注:使用MongoDB数据库对数据进行操作

@DubboService
public class RecommendUserApiImpl implements RecommendUserApi {
    @Autowired
   private MongoTemplate mongoTemplate;
  
 /**
     * 根据用户id查询最佳好友
     * @param toUserId
     * @return
     */
    @Override
    public RecommendUser queryWithMaxScore(Long toUserId) {
        //根据toUserId查询,根据评分score排序,获取第一条
        //构建Criteria
        Criteria criteria = Criteria.where("toUserId").is(toUserId);
        //构建Query对象
        Query query = new Query(criteria);
        //排序:分数降序,分页第一条
        query.with(Sort.by("score").descending()).limit(1);
//      Query query = Query.query(criteria).with(Sort.by(Sort.Order.desc("score"))).limit(1);
        RecommendUser one = mongoTemplate.findOne(query, RecommendUser.class);
        //调用mongoTemplate查询
        return one ;
    }
}

第三步:对最近好友信息进行处理,获取该好友的用户id,拿着id去用户表去查用户信息

第四步:定义封装类,将两表的相关信息进行合并赋值并返回。

 TodayBest  信息封装—最佳好友类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class TodayBest implements Serializable {
    private Long id ;   //用户id
    private String avatar ;     //头像
    private String nickname ;   //昵称
    private String gender ;     //性别
    private Integer age ;   //年龄
    private String[] tags ;     //标签
    private Long fateValue ;     //缘分值

    /**
     * 在vo对象中补充一个方法,封装转化过程
     * 将用户信息和推荐信息合并赋值
     * 由UserInfo转化为TodayBest
     */
    public static TodayBest init(UserInfo userInfo , RecommendUser recommendUser){
        TodayBest vo = new TodayBest();
        BeanUtils.copyProperties(userInfo,vo);
        //标签分割设置
        if (userInfo.getTags() != null){
            vo.setTags(userInfo.getTags().split(","));
        }
        //获取缘分值并设置
        long value = recommendUser.getScore().longValue();
        vo.setFateValue(value);
        return vo ;
    }
}

 注:用户信息存储在Mysql数据库中,好友信息存储在MongoDB数据库中,在需要互相使用数据的时候,使用Dubbo进行远程调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/452670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JS之Map的基本使用

一、Map的基本API 创建: const map new Map()插入:map.set("name", "郑建")读取:map.get("name")判断:map.has("name")删除:map.delete大小:map.size遍历&#…

webhub123 设计师好用的笔刷纹理网站收录​

整理了一些可以免费下载的好用的笔刷和纹理资源网站,收录到 webhub123 设计师好用的笔刷纹理网站收录​http://www.webhub123.com/#/home/detail?projectHashid31645930&ownerUserid21336964 收录效果如下,每个网站显示为一张图片,点击…

【Python基础入门学习】Python基础语法学习

基础认识 1. 注释2. 变量2.1 变量命名规则2.2 变量的类型2.3 不同类型之间的运算规则2.4 变量的输入和输出2.4.1 print 函数使用2.4.2 input 函数使用 2.5 变量的类型转换 3. 分支语句3.1 判断的定义3.2 if 判断语句基本语法3.3 else 处理条件不满足的情况3.4 逻辑运算3.5 if 的…

小红书数据分析:这个夏天,“围炉冰茶”继续刷屏

导语 去年秋冬开始爆火的“围炉煮茶”,果集千瓜数据显示:近90天来,笔记预估阅读总数达1,038.83万,同比下降80.67%,笔记互动总量61.78万,下降高达76.85%。 图 | 果集千瓜数据 受到时令的影响,围…

算法 - 随机 Coding 刷算法合集 [1]

目录 一.数组中重复的数字 [集合] 1.题目要求 2.题目思路 3.题目实现 二.二维数组中的查找 [数组] 1.题目要求 2.题目思路 3.题目实现 三.替换空格 [字符串] 1.题目要求 2.题目思路 3.题目实现 四.从尾到头打印链表 [链表] 1.题目要求 2.题目思路 3.题目实现 …

电脑技巧:分享浏览器5个小技巧,太实用了

大家在日常办公当中,浏览器可以说占用非常大的比重,比如搜个素材、图片、文档等等,今天就来给大家分享5个浏览器使用的小技巧,希望对大家能有所帮助! 1、浏览器常用快捷键梳理 其实Web浏览器快捷键很多,但…

MySQL_第14章_视图

第14章_视图 1. 常见的数据库对象 对象描述表(TABLE) 表是存储数据的逻辑单元,以行和列的形式存在,列就是字段,行就是记录 数据字典 就是系统表,存放数据库相关信息的表。系统表的数据通常由数据库系统维护, 程序…

Java多线程基础-6:线程安全问题及解决措施,synchronized关键字与volatile关键字

线程安全问题是多线程编程中最典型的一类问题之一。如果多线程环境下代码运行的结果是符合我们预期的,即该结果正是在单线程环境中应该出现的结果,则说这个程序是线程安全的。 通俗来说,线程不安全指的就是某一代码在多线程环境下执行会出现b…

【边缘计算】登临(Goldwasser-UL64)BW-BR2边缘设备配置指南

目录 开箱配置激活SDK环境测试cuda兼容性 开箱配置 更改盒子root用户密码: sudo passwd root(密码同为root) 切换到root用户身份: su root查看ssh的状态,没有返回说明没有启动 sudo ps -e|grep ssh此时说明ssh服务已启动。 更改ssh配置文…

Android MediaCodec dump MP4实践小结

1.应用背景 在一些集成了算法SDK的Android APP中,这些APP是取出摄像头实时帧,然后调用视觉算法SDK并产生检测结果。而当测试人员发现某一场景下算法效果欠佳时,需要从摄像头实时原始数据帧dump一段视频(mp4格式)&#…

【TB作品】MSP430单片机 Proteus仿真 DS18B20温度 LCD1602显示器 温度读取与显示

效果图如下: 首先,让我们先来说说DS18B20集成电路。 • DS18B20是一款采用OneWire通讯协议的集成电路,因此只需要一条线就可以与微控制器通讯。它不需要额外的电源,但是也有外部电源输入端口。 • OneWire设备具有64位的ROM代码。如我们之前所说,这64位的前8位是家…

HDCTF

Welcome To HDCTF 2023 看源码找到game.js 找到这一串 放到控制台运行即可 SearchMaster 题目让post提交一个data 随便传一个在页面执行了 当传入{时他会报错,看报错信息发现 Smarty,猜测Smarty的ssti,数据发送到前端 用{if}标签即可 {…

CHAPTER 5: 《DESIGN CONSISTENT HASHING》 第5章 《设计一致的哈希》

CHAPTER 5: DESIGN CONSISTENT HASHING 为了实现水平扩展,有效且均匀地分发请求/数据是很重要的在服务器上。一致散列是实现这一目标的常用技术。但首先,让我们深入了解一下这个问题。 重组问题 如果您有n个缓存服务器,那么平衡负载的常用…

PCB射频电路四大基础特性及设计技巧

由于射频(RF)电路为分布参数电路,在电路的实际工作中容易产生趋肤效应和耦合效应,所以在实际的PCB设计中,会发现电路中的干扰辐射难以控制。 如:数字电路和模拟电路之间相互干扰、供电电源的噪声干扰、地线不合理带来的干扰等问题…

catkin_make_workspace

ERROR1 : CMake Error at /opt/ros/melodic/share/cv_bridge/cmake/cv_bridgeConfig.cmake:113 (message): Project ‘cv_bridge’ specifies ‘/usr/include/opencv’ as an include dir, which is not found. It does neither exist as an absolute directory nor in ‘${{pr…

Vue-列表过滤

列表过滤 对已知的列表进行数据过滤(根据输入框里面的内容进行数据过滤) 编写案例 通过案例来演示说明 效果就是这样的 输入框是模糊查询 想要实现功能,其实就两大步,1获取输入框内容 2根据输入内容进行数据过滤 绑定收集数据 我们可以使用v-model去…

6.3 收敛性与稳定性

6.3.1 收敛性 数值计算方法的收敛性是指,当取步长趋近于零时,数值解趋近于精确解的速度。一般来说,数值计算方法的收敛性是判断其优劣的重要指标之一。 数值计算方法的收敛性可以通过数学分析来研究,一般需要对数值解和精确解之…

08-Node.js—nvm

目录 1、介绍2、使用2.1 下载安装2.2 常用命令2.2.1 nvm list available2.2.2 nvm list2.2.3 nvm install 18.12.12.2.4 nvm install latest2.2.5 nvm uninstall 18.12.12.2.6 nvm use 18.12.1 参考 1、介绍 nvm 全称 Node Version Manager 顾名思义它是用来管理 node 版本的工…

系统集成项目管理工程师——考试重点(三)项目管理一般知识

1.项目定义: 为达到特定的目的,使用一定资源,在确定的期间内,为特定发起人提供独特的产品、服务或成果而进行的一系列相互关联的活动的集合。 2.项目目标: 成果性目标:项目产品本身 约束性目标&…

频繁GC引起卡顿问题排查与解决

一 问题描述 今天测试组更新测试环境后发现系统卡顿,无法办理任何业务,重启系统后问题仍然存在。已经到项目后期,迭代测试时间十分紧张。此问题直接影响到项目进度 二 排查过程 1.执行命令top Linux 下常用top命令显示系统中各个进程的资…