目录
一、为什么要使用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进行远程调用。