项目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

发布了308 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_28764557/article/details/104088436
今日推荐