目录

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

二、缘分值最佳好友

思路


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

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

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

二、缘分值最佳好友

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

思路

技术选型为什么用mongodb 为什么要使用mongodb_java

第一步:通过令牌拦截器解析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进行远程调用。