【Quanyou アプリ】MongoDB データベースを使用する理由 — 運命値が最も高い親友を照会し、関連情報を返す

目次

1. MongoDB データベースを使用する理由

2.運命は親友

一連の考え


1. MongoDB データベースを使用する理由

このプロジェクトに含まれるサークル(動的)機能は、ユーザーが友達のサークルにいいねやコメントをすることで、ユーザーの数が増え続けるにつれて、コメント、いいね、コレクションなどの情報も増加し続けます。これらの情報を読んで、書き込みを減らします、つまり、読み取りを増やして書き込みを減らします;コメント/いいねなどのデータが多いか少ないかは問題ではなく、影響はなく、データの価値は低いです; フォローアップには、近くの人を表示する機能も含まれ、地理的な場所の関連データも含まれます。

したがって、上記に基づいて、このプロジェクトには大量のデータの処理が含まれ、読み取りが多く、書き込みが少なく、保存されたデータの価値が低く、地理的な場所に関連するデータなども含める必要があります。そうでない場合現時点で mysql または redis を使用するのは適切ではありませんが、MongoDB データベースを使用する膨大な量のデータを効率的に処理することはできません。

2.運命は親友

要件: 最高の運命値に従って親友を照会し、関連情報を返す

一連の考え

ステップ 1: トークン インターセプターを介してトークンを解析し、ユーザー 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 ;
    }

ステップ 2: ユーザー 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 ;
    }
}

ステップ 3: 最近の友達情報を処理し、友達のユーザー ID を取得し、その ID をユーザー テーブルに渡してユーザー情報を確認する

ステップ 4: カプセル化クラスを定義し、2 つのテーブルの関連情報を組み合わせて割り当て、それを返します。

 TodayBest   Information Encapsulation — ベスト フレンド クラス

@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 を使用してリモート呼び出しを行います.

おすすめ

転載: blog.csdn.net/zsy3757486/article/details/130268685