中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

類知乎網站的實現

發布時間:2020-03-03 06:48:09 來源:網絡 閱讀:492 作者:梁十八 欄目:關系型數據庫


類知乎網站的實現

類知乎網站的實現



查詢問題列表:

從這個方法返回的數據中可以看出,有一個answer_number字段, 即這個問題當前有多少個回答

1.先查詢問題,再查詢答案數量,這是最常想到的辦法,代碼如下:

????????類知乎網站的實現

????這種方法的優點是簡單直接, 缺點是查詢次數太多。假設有100 個問題,那么就需要查詢101 次才能完成。這會導致網頁加載數據顯著降低。

2.使用$lookup 同時查詢問題和回答

????在第8章中講到了聚合操作的$lookup操作符。使用$lookup可以一次性查詢兩個集合。假設有100個問題,只需要查詢1次,就可以同時獲得所有的問題,以及它們各自對應的回答。使用聚合操作配合$lookup的代碼如下:

????類知乎網站的實現

????類知乎網站的實現

????類知乎網站的實現



實現“查詢回答”功能:

進入一個問題的答案列表頁以后,除看到答案外,還能夠看到這個問題的描述。這說明在答案列表頁面,不僅要查詢答案answer集合,還需要查詢問題question集合。

使用聚合查詢的$lookup可以提高查詢的效率,對應的代碼如下:

類知乎網站的實現

類知乎網站的實現

? 第2~8行:首先使用$match篩選出目標問題, 再根據目標問題對應的objectid查詢問題和相應的回答, 井把回答存在名為answer_list的列表中。
? 第9行:聚合操作返回的結果是一個可法代的對象, 由于可迭代的對象的ID(Objectid)不重復,所以這里必定只有一個元素。因此把它轉化為列表再取下標為0的元素。
? 第10~ 1 6 行:記錄問題的信息。
? 第17 ~23 行:記錄每一條回答的內容。
? 第24 行: 把回答的列表重新存入問題信息中。
修改好query_answer 方法后重啟網站。在問題列表頁中單擊任何一個問題,則可以正常進入該問題的答案列表頁面


實現“提問與回答”功能:

提問對應MongoUtil類中的方法為insert_question,回答對應MongoUtil類中的方法為insert_answer,它們的代碼如下:

類知乎網站的實現

類知乎網站的實現

這兩個方法屬于非常常規的數據插入操作。

在insert_answer方法中,參數question_id是問題對應的Objectld的字符串形式,需要首先將question_id轉化為Objectld對象,再插入到MangoDB中


實現“點贊”與“點踩”勸能:

為問題“點贊”或“點睬” 對應MongoUtil類中的方法為vote_for_ question , 為答案“點贊”和“點踩”對應的方法名為vote_for_answer。它們都使用了MongoDB的update_one方法。

使用“$inc”操作符實現字段自增自減:

在MangoDB的基礎部分中,update_one的用法為:

handler.update_one({"name":"xxx"},{"$set":{"age":12}})

意思是查詢name字段值為xxx的記錄,然后把這條記錄的age字段更新為12

但是在這個項目中,“ 點贊”功能需要把字段vote_up 自增1,“ 點踩”功能需要把vote down字段自增l ,而且可能多個訪客會同時對一個問題“點贊",所以“點贊”和“點踩”這兩個操作都必須是原子操作,不能先查詢當前問題的vote_ up是多少,然后再使用update_one來設置新的值。
為了實現原子操作的字段自增,就不能使用“$set”操作符而要改成“$inc”操作符。這個的inc對應了英文單詞increase(增加)。

使用格式為:
????handler . update_one({"_id":問題或答案的Objectid},{"$inc":{"vote_up":1}})

實際上,自減就是在“$inc”的值對應的字典中把值設為負數。但由于本項目需要記錄“點踩”的數量,所以把“點贊”和“點踩”分成兩個字段來保存。因此無論是“點贊”還是“點踩”都是自增操作。

2. 實現“點贊”和“點踩”
修改點贊和點踩的代碼,實現它們的功能:

類知乎網站的實現

需要注意的是,傳入進來的value可能是vote_up或者vote_down,因此把它直接作為$inc值字典的Key就可以自動實現贊或者踩。
修改完成以后重啟網站,可以看到“點贊”和“點踩”功能已經恢復正常。





向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

静安区| 海原县| 奉贤区| 临海市| 南江县| 永定县| 石阡县| 夏津县| 汽车| 巴里| 睢宁县| 车险| 来宾市| 泌阳县| 昌邑市| 鄂尔多斯市| 西盟| 微山县| 罗山县| 尖扎县| 太仆寺旗| 浦北县| 简阳市| 吴旗县| 通海县| 迁西县| 鞍山市| 元江| 沙田区| 苏尼特左旗| 睢宁县| 读书| 六盘水市| 沙洋县| 鄂托克前旗| 海淀区| 绥阳县| 栖霞市| 克拉玛依市| 罗定市| 兴安盟|