七(7)探花功能-MongoDB地理位置查询-附近的人

课程总结

1.探花功能

  1. 业务需求

  2. 执行过程

2.MongoDB的地理位置查询

  1. 地理位置查询的应用场景

  2. 查询案例

3.搜附近

  1. 上报地理位置

  2. 使用MongoDB搜索附近

一. 探花左划右滑

探花功能是将推荐的好友随机的通过卡片的形式展现出来,用户可以选择左滑、右滑操作,左滑:“不喜欢”,右滑:“喜欢”。

喜欢:如果双方喜欢,那么就会成为好友。

1572105631737

如果已经喜欢或不喜欢的用户在列表中不再显示。

1-1 技术支持

1. 数据库表

image-20220927104716349

2. Redis缓存

探花功能使用Redis缓存提高查询效率。

对于喜欢/不喜欢功能,使用Redis中的set进行存储。Redis 的 Set 是无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。使用Set可以方便的实现交集,并集等个性化查询。

数据规则:

喜欢:USER_LIKE_SET_{ID}

不喜欢:USER_NOT_LIKE_SET_{ID}

1-2 查询推荐用户

1. 接口文档

image-20220927105211054

单次查询随机返回10条推荐用户数据

需要排除已喜欢/不喜欢的数据

2. 思路分析

查询探花卡片推荐用户列表

1、查询已喜欢/不喜欢的用户列表

2、查询推荐列表,并排除已喜欢/不喜欢用户

3、如果推荐列表不存在,构造默认数据

image-20220927105428020

3. 实体对象
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "user_like")
public class UserLike implements java.io.Serializable {
   

    private static final long serialVersionUID = 6739966698394686523L;

    private ObjectId id;
    @Indexed
    private Long userId; //用户id,自己
    @Indexed
    private Long likeUserId; //喜欢的用户id,对方
    private Boolean isLike; // 是否喜欢
    private Long created; //创建时间
    private Long updated; // 更新时间

}
4. controller

TanhuaController

    /**
     * 探花-推荐用户列表
     */
    @GetMapping("/cards")
    public ResponseEntity queryCardsList() {
   
        List<TodayBest> list = this.tanhuaService.queryCardsList();
        return ResponseEntity.ok(list);
    }
5. service

TanhuaService

#默认推荐列表
tanhua:
  default:
    recommend:
      users: 2,3,8,10,18,20,24,29,27,32,36,37,56,64,75,88
    @Value("${tanhua.default.recommend.users}")
    private String recommendUser;

	//探花-推荐用户列表
    public List<TodayBest> queryCardsList() {
   
        //1、调用推荐API查询数据列表(排除喜欢/不喜欢的用户,数量限制)
        List<RecommendUser> users = recommendUserApi.queryCardsList(UserHolder.getUserId(),10);
        //2、判断数据是否存在,如果不存在,构造默认数据 1,2,3
        if(CollUtil.isEmpty(users)) {
   
            users = new ArrayList<>();
            String[] userIdS = recommendUser.split(",");
            for (String userId : userIdS) {
   
                RecommendUser recommendUser = new RecommendUser();
                recommendUser.setUserId(Convert.toLong(userId));
                recommendUser.setToUserId(UserHolder.getUserId());
                recommendUser.setScore(RandomUtil.randomDouble(60, 90));
                users.add(recommendUser);
            }
        }
        //3、构造VO
        List<Long> ids = CollUtil.getFieldValues(users, "userId", Long.class);
        Map<Long, UserInfo> infoMap = userInfoApi.findByIds(ids, null);

        List<TodayBest> vos = new ArrayList<>();
        for (RecommendUser user : users) {
   
            UserInfo userInfo = infoMap.get(user.getUserId());
            if(userInfo != null) {
   
                TodayBest vo = TodayBest.init(userInfo, user);
                vos.add(vo);
            }
        }
        return vos;
    }
6. API实现

RecommendUserApi


    /**
     * 查询探花列表,查询时需要排除喜欢和不喜欢的用户
     */
    List<RecommendUser> queryCardsList(Long userId, int count);

RecommendUserApiImpl


   /**
     * 查询探花列表,查询时需要排除喜欢和不喜欢的用户
     * 1、排除喜欢,不喜欢的用户
     * 2、随机展示
     * 3、指定数量
     */
    public List<RecommendUser> queryCardsList(Long userId, int counts) {
   
        //1、查询喜欢不喜欢的用户ID
        List<UserLike> likeList = mongoTemplate.find(Query.query(Criteria.where("userId").is(userId)), UserLike.class);
        List<Long> likeUserIdS = CollUtil.getFieldValues(likeList, "likeUserId", Long
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值