教你如何用 MongoDB 實現評論榜功能

安全劍客發表於2019-09-10
Mongodb很適合做這件事,api的呼叫僅僅是使用到了入門級別的CRUD,理清楚了思路,編碼也會順風順水,所以你會發現我在這篇部落格中說的比編碼還多。
評論榜預期的功能

就像是StackOverFlow的那樣, 使用者可以發出自己的提問,其他使用者來解答, 同時樓主可以回覆別人的評論,別人依然可以回覆樓主

資料結構

mongodb可以儲存文件啊, 其實我們要做的就是構建一個合適的類,評論幫也就成功一大半了

問題/ 評論 實體如下
問題
public class Problem implements Serializable {
@Id
private String _id;// key
private String nickname; // 使用者名稱
private String avator; // 使用者頭像
private String userId; // 戶名id
private String title ; // 標題
private String content ;  // 內容
private boolean answered ; // 是否已經回答
private Date createTime ; // 建立時間
private boolean flag =false; // 標記是否是本人,預設是非本人
private List<Answer> answerList; // 問題的回答列表
}
評論
public class Answer {
    private String id;// 當前回答的唯一標識
    private String nickname; // 使用者名稱
    private String avator; // 使用者頭像
    private  Integer userId; // 回答的使用者的id
    private  String Content ; // 回答的內容
    private  Date time;
    private  boolean flag = false;// 預設false.不是本人
    private  Integer group; // 分組的標記
}
思路

Answer實體中,並沒有新增一個集合用來存放Answer型別的實體,如果新增上這個集合的話,確實想法還不錯,回覆中有其他人對自己的回覆,天生的樹形結構,但是考慮到前端的渲染的難度加大,放棄了這種方案

問題的實體類中維護了一個回答的實體類的集合,所有針對樓主問題的回答例項全部放在這個集合中, 也包括樓主對問題回答者的回覆, 還包含回答者對問題的回覆

於是這樣就僅僅存在兩層,一個問題中維護著對這個問題的全部回覆,前端渲染的難度大大降低,但是後來卻來事了
使用者查詢一個問題的詳情時,後端如何處理

當使用者查詢一個問題的詳情時,後端拿著問題的id,去資料庫中將問題的例項取出來,緊接著處理Answer集合,將按照時間排序的集合按照我們指定的方式分組,再按時間排序

按什麼分組呢?

當時是按照不同的使用者分組, 同一個使用者的全部評論,已經樓主對它的回覆,以及別人對它的回覆都放在一起, 所以需要一個欄位,group(我選的使用者id), 專門儲存分組的標誌. 組內的例項再按照時間排序,這樣整體的層次就劃分好了

public JsonResult problemDetail(@PathVariable String problemId){
    Optional<Problem> byId = problemRepository.findById(problemId);
    if (!byId.isPresent()){
        return JsonResult.fail("您沒有獲取到詳情頁,請聯絡管理員");
    }
    Problem problem = byId.get();
    if (problem.getAnswerList().size()>0){
            Map<Integer, List<Answer>> collect = problem.getAnswerList()
            .stream().collect(Collectors.groupingBy(Answer::getGroup));
            ArrayList<Answer> list = new ArrayList<>();
            collect.forEach((k,v)->{
                list.addAll(v);
            });
            problem.setAnswerList(list);
        }
    return JsonResult.ok("返回詳情頁"+problem);
}
定位出當前使用者的評論

如果前端想在頁面的分左右兩部分展示自己的評論和別人的評論,就需要一個標記,既然上面都已經在遍歷了,多加一個判斷也無妨, 拿著前端提交過來的使用者id和Answer中的userId比對, 如果相等,就把這個評論的flag標記為true, 前端根據這個標記區分, 從而給使用者更多的許可權,比如刪除自己的評論

侷限性

如果沒個問題都像網易音樂那種,上萬條評論,這樣的話,估計就廢了,雖然使用stream會快,但是也扛不住量啊, 但是數量小的話,還是可以接受的, 其實理想的狀態是評論可以以分頁的形式獲取出來, 感覺才正宗。

原文連結:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2656547/,如需轉載,請註明出處,否則將追究法律責任。

相關文章