項目2---十次方項目開發---後臺--mongoDB---03

單點登錄。

分佈式最流行的是JWT。

單點登陸。

無狀態就是服務器不存登陸信息。服務器存的話只能存session裏面。

前端是存到cookie裏面。

登陸信息取出來放在消息頭裏面發給服務端。

-----------------------------------------------------------------------------------01-----------------------------------------------------------------------------------

比較重要的。

mongoDB是非關係型數據庫。

關係型數據庫就是表和表之間是有關係的。

一對一一對多靠主鍵外鍵,多對多是關係表。

-----------------------------------------02----------------------------------------03---------------------------------------------------------------------------------

mongodb數據庫的基本類型:

支持的數據類型:

------------------------------------------------------------------------------------------04----------------------------------------------------------------------------

:正則表達式必須放在兩個斜槓之間。

主鍵必須是_id。

----------------------------------------------------------------------------------05------------------------------------------------------------------------------

安裝與啓動。

win的安裝與啓動,本地只用客戶端。

本地的客戶端啓動之後,我們不要關閉這個啓動的窗口,再打開一個窗口。

----------------------------------------------------------------------06------------------------------------------------------------------------------------------

Centos啓動mongodb。

docker run -di --name=tensquare_mongo -p 27017:27017 mongo

連接遠程的:

------------------------------------------------------------------------------------07-------------------------------------------------------------------------

創建數據庫:

搞吐槽的微服務。

必須是_id。

樹的表結構:

----------------------------------------08--------------------------------------------------------------------------------------------------------------------------

操作mongdb:

----------------------------------------09-------------------------------------------------------------------------------------------------------------------------

注意插入的格式:

注意查詢的格式:插入的時候要是不指定id的話給你生成一個_id。

查詢:

----------------------------------------------------------------------------10-------------------------------------------------------------------------------------

mongdb教程網:https://www.php.cn/redis/421928.html  很好的視頻教程視頻。

update:

修改某個字段其他的原封不動。

刪除:

------------------------------------------------------------------------------------11------------------------------------------------------------------------------

查詢總數:

模糊查詢:

只是數據是json格式的。

------------------------------------------------------------------------------12---------------------------------------------------------------------------------------

複雜的查詢:

大於:

包含不包含:

------------------------------------------

範圍查詢:

列值增長:

有概念就可以了。

------------------------------------------------------------------------13--------------------------------------------------------------------------------------

java操作mongdb。

第一步:新建工程

第二步:導包

<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb‐driver</artifactId>
<version>3.6.3</version>
</dependency>
</dependencies>

第三步:操作

public static void main(String[] args) {
        //連接mongo服務器
        MongoClient client = new MongoClient("192.168.244.136");
        //得到要操作的數據庫
        MongoDatabase spitdb = client.getDatabase("spitdb");
        //得到要操作的集合
        MongoCollection<Document> spit = spitdb.getCollection("spit");
        //得到表
        FindIterable<Document> documents = spit.find();
        //遍歷數據
        for(Document document:documents){
            System.out.println("內容:"+document.getString("content"));
        }
        client.close();
    }

-------------------------------------------------------------------------------14--------------------------------------------------------------------------------------

複雜的查詢:

public static void main(String[] args) {
        //連接mongo服務器
        MongoClient client = new MongoClient("192.168.244.136");
        //得到要操作的數據庫
        MongoDatabase spitdb = client.getDatabase("spitdb");
        //得到要操作的集合
        MongoCollection<Document> spit = spitdb.getCollection("spit");
        //封裝查詢條件
        BasicDBObject bean = new BasicDBObject("content","你輸誰你在哪裏123");
        //得到文檔
        FindIterable<Document> documents = spit.find(bean);
        //遍歷數據
        for(Document document:documents){
            System.out.println("內容:"+document.getString("content"));
        }
        client.close();
    }
public static void main(String[] args) {
        //連接mongo服務器
        MongoClient client = new MongoClient("192.168.244.136");
        //得到要操作的數據庫
        MongoDatabase spitdb = client.getDatabase("spitdb");
        //得到要操作的集合
        MongoCollection<Document> spit = spitdb.getCollection("spit");
        //封裝查詢條件
        //BasicDBObject bean = new BasicDBObject("content","你輸誰你在哪裏123");
        //查詢訪問量大於100的
        BasicDBObject bean = new BasicDBObject("visits",new BasicDBObject("$gt",100));
        //得到表
        FindIterable<Document> documents = spit.find(bean);
        //遍歷數據
        for(Document document:documents){
            System.out.println("內容:"+document.getString("content"));
            System.out.println("訪問量:"+document.getInteger("visits"));
        }
        client.close();
    }

------------------------------------------------------------------------15--------------------------------------------------------------------------------------

添加數據:

  public static void main(String[] args) {
        //連接mongo服務器
        MongoClient client = new MongoClient("192.168.244.136");
        //得到要操作的數據庫
        MongoDatabase spitdb = client.getDatabase("spitdb");
        //得到要操作的集合
        MongoCollection<Document> spit = spitdb.getCollection("spit");
        //添加數據
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("content","java添加的數據");
        map.put("visits",100);
        Document documentnew = new Document(map);
        spit.insertOne(documentnew);
        FindIterable<Document> documents = spit.find();
        for(Document document:documents){
            System.out.println("內容:"+document.getString("content"));
            System.out.println("訪問量:"+document.getInteger("visits"));
        }
        client.close();
    }

------------------------------------------------------------------------------16----------------------------------------------------------------------------------------

開始最重要的了:springdataMongodb這個框架是很好的。

第一步:新建項目。

 <dependencies>
         <dependency>
             <groupId>com.tensquare</groupId>
             <artifactId>tensquare_common</artifactId>
             <version>1.0-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-mongodb</artifactId>
         </dependency>
     </dependencies>

第二步:寫yml文件。

server:
  port: 9006
spring:
  application:
      name: tensquare-spit
  data:
     mongodb:
       host: 192.168.244.136
       database: spitdb

第三步:啓動類

@SpringBootApplication
public class SpitApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpitApplication.class);
    }

    @Bean
    public IdWorker idWorker(){
        return new IdWorker();
    }
}

------------------------------------------------------------------------17--------------------------------------------------------------------------------------

整合mongodb的curd。

第一步:實體類

第二步:寫dao

第三步:寫一套:

------------------------------------------------------------------------18--------------------------------------------------------------------------------------

根據父節點查詢吐槽:

第一步:

注意分頁的寫法

 @GetMapping("/comment/{parentId}/{page}/{size}")
    public Result findByParentId(@PathVariable("parentId") String parentId, @PathVariable("page")Integer page, @PathVariable("size")Integer size){
        Page<Spit> pageSpit = spitService.findByParentid(parentId, page, size);
        return new Result(true, StatusCode.OK, "查詢成功",new PageResult<Spit>(pageSpit.getTotalElements(),pageSpit.getContent()));
    }
  public Page<Spit> findByParentid(String parentId, Integer page, Integer size){
        Pageable pageable= PageRequest.of(page-1,size);
        return  spitDao.findByParentid(parentId,pageable);
    }

第二步:寫Dao。

注意或者和操作數據庫的寫法是一樣的。

public interface SpitDao extends MongoRepository<Spit,String> {
    /**
     * 根據父級id查詢吐槽數據
     * @param parentId
     * @param pageable
     * @return
     */
    Page<Spit> findByParentid(String parentId, Pageable pageable);
}

第三步:寫controller

    @GetMapping("/comment/{parentId}/{page}/{size}")
    public Result findByParentId(@PathVariable("parentId") String parentId, @PathVariable("page")Integer page, @PathVariable("size")Integer size){
        Page<Spit> pageSpit = spitService.findByParentid(parentId, page, size);
        return new Result(true, StatusCode.OK, "查詢成功",new PageResult<Spit>(pageSpit.getTotalElements(),pageSpit.getContent()));
    }

第四步:查詢

看下查詢和插入的對照。

http://localhost:9006/spit
http://localhost:9006/spit/comment/1/1/2

------------------------------------------------------------------------19--------------------------------------------------------------------------------------

吐槽的點贊效率問題:

    //方式一:效率有問題
        /*Spit spit = spitDao.findById(spitId).get();
        spit.setThumbup((spit.getThumbup()==null?0:spit.getThumbup())+1);
        spitDao.save(spit);*/

效率問題:

 @Autowired
    private MongoTemplate mongoTemplate;
//方式一:使用原生mongo命令來實現自增 db.spitdb.update({"_id":"1"}:{$inc:{thumbup:NumberInt(1)}})
        Query query=new Query();
        query.addCriteria(Criteria.where("_id").is(spitId));

        Update update=new Update();
        update.inc("thumbup",1);

        mongoTemplate.updateFirst(query,update,"spitdb");
//方式二:使用原生mongo命令來實現自增 db.spitdb.update({"_id":"1"}:{$inc:{thumbup:NumberInt(1)}})

測試:

http://localhost:9006/spit/thumbup/1/

------------------------------------------------------------------------20----------21----------------------------------------------------------------------------

不能重複點贊:通過redis。

   @PostMapping("/thumbup/{spitId}")
    public Result thumbup(@PathVariable String spitId){
        //判斷當前用戶是否已經點贊,但未做認證,暫時先把userid寫死 實際上是帶token去驗證的
        String userid ="1113";
        if(redisTemplate.opsForValue().get("thumbup_"+spitId+"_"+userid)!=null){
            return new Result(false, StatusCode.REPERROR, "不能重複點贊");

        }
        spitService.thumbup(spitId);
        redisTemplate.opsForValue().set("thumbup_"+spitId+"_"+userid,1);
        return new Result(true, StatusCode.OK, "點贊成功");
    }

------------------------------------------------------------------------22----------------------------------------------------------------------------

完善添加吐槽:

@PostMapping("/thumbup/{spitId}")
    public Result thumbup(@PathVariable String spitId){
        //判斷當前用戶是否已經點贊,但未做認證,暫時先把userid寫死 實際上是帶token去驗證的
        String userid ="1113";
        if(redisTemplate.opsForValue().get("thumbup_"+userid+spitId)!=null){
            return new Result(false, StatusCode.REPERROR, "不能重複點贊");

        }
        spitService.thumbup(spitId);
        redisTemplate.opsForValue().set("thumbup_"+userid+spitId,1);
        return new Result(true, StatusCode.OK, "點贊成功");
    }

------------------------------------------------------------------------23----------------------------------------------------------------------------

完善添加吐槽:

 public void save(Spit spit){
        spit.set_id(idWorker.nextId()+"");
        spit.setPublishtime(new Date());//發佈日期
        spit.setVisits(0);//瀏覽量
        spit.setShare(0);//分享數
        spit.setThumbup(0);//點贊數
        spit.setComment(0);//回覆數
        spit.setState("1");//狀態
        //如果當前添加的吐槽,有父節點,name父節點的吐槽回覆數要加1 實際上這個層數是不對的
        if(spit.getParentid()!=null && !"".equals(spit.getParentid())){
            //爲在別人的下面回覆
            Query query=new Query();
            query.addCriteria(Criteria.where("_id").is(spit.getParentid()));//id等於當前spit的父節點
            Update update=new Update() ;
            update.inc("comment",1);//父節點的吐槽的回覆數加1
            mongoTemplate.updateFirst(query,update,"spitdb");
        }
        spitDao.save(spit);
    }

------------------------------------------------------------------------24----------------------------------------------------------------------------

技術鏈接:https://blog.csdn.net/ownfire/article/details/73064753

發佈了304 篇原創文章 · 獲贊 11 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章