【新时代圈友app】为什么要使用MongoDB数据库?— 查询缘分值最高的最佳好友并返回相关信息
目录
一、为什么要使用MongoDB数据库?
二、缘分值最佳好友
思路
一、为什么要使用MongoDB数据库?
本项目涉及到的圈子(动态)功能,用户会对朋友圈进行点赞、评论;那么随着用户的不断增多,评论点赞收藏等信息也会不断增多;相对来说用户对这些信息看的比较多,写比较少,也就是读多写少;且评论/点赞数等数据多一条少一条都没什么关系,没有什么影响,数据价值低;且后续还涉及到一个功能,附近人的展示,还会涉及到地理位置的相关数据;
所以综合以上,本项目涉及到对海量数据的处理,且读多写少,存储的数据价值低,且还需包括地理位置相关数据等;如果这个时候使用mysql或者redis的时候就不合适,无法高效的对海量数据进行处理,所有这里就用到了MongoDB数据库。
二、缘分值最佳好友
需求:根据缘分值最高的查询出最佳好友并返回相关信息
思路
第一步:通过令牌拦截器解析token获取到用户id;
@Service
public class TanhuaService {@DubboReferenceprivate RecommendUserApi recommendUserApi ;@DubboReferenceprivate UserInfoApi userInfoApi ; //查询今日佳友数据public TodayBest todayBest() {//1、获取用户idLong 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 {@Autowiredprivate MongoTemplate mongoTemplate;/* 根据用户id查询最佳好友* @param toUserId* @return*/@Overridepublic RecommendUser queryWithMaxScore(Long toUserId) {//根据toUserId查询,根据评分score排序,获取第一条//构建CriteriaCriteria 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 ; //用户idprivate 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进行远程调用。