SpringCloud学习笔记(六)java传统的mongoDB和SpringDataMongoDB(最像关系型数据库的非关系型数据库)

传统的mongoDB(不属于SpringData系列)

MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热 门 的一种。它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最 像关 系数据库的产品。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以 存 储比较复杂的数据类型。
 

1.基本数据类型 Bson

null: 用于表示控制或者不存在的字段,{“x”:null}

布尔值: 布尔类型有两个值true和false,{“x”:true}

数值:shell默认使用64位浮点型数值。{“x”:3.14} 或{“x”:3} 。对于整形值,可以使用NumberInt(4字节符号整数) 或NumberLong(8字节符号整数),{“x”:NumberInt("3")}

字符串: UTF-8字符串都可以表示为字符串类型的数据,{“x”: "呵呵"}

日期: 日期被存储为自新纪元以来经过的毫秒数,不存储时区,{“x”:new Date()}

正则表达式: 查询时,使用正则表达式作为限定条件,语法与JavaScript的正则表达式相同,{“x”: /[abc]/}

数组: 数据列表或数据集可以表示为数组,{“x”: ["a","b"]}

内嵌文档: 文档可以嵌套其他文档,被嵌套的文档作为值来处理,{“x”: {"y": 3}}

对象id: 对象id是一个12字节的字符串,是文档的唯一标识,{“x”: objectId()}

二进制数据: 二进制数据是一个任意字节的字符串,它不能直接在shell中使用,如果要将非utf-字符保存到数据中,二进制数据是唯一的方式

代码: 查询和文档中可以包含任何JavaScript代码,{“x”: function(){/..../}}

 

2.连接: 服务器(mongod.exe)和客户端(mongo.exe)

客户端默认端口27017  

安装: mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi

安装
双击 mongodb-win32-x86_64-2008plusssl-3.2.10-signed.msi  按照提示步骤安装即可。安装完成后,软件会安装在C:\Program Files\MongoDB 目录中。
 我们要启动的服务程序就是C:\Program Files\MongoDB\Server\3.2\bin目录下的 mongod.exe,为了方便我们每次启动,我将C:\Program Files\MongoDB\Server\3.2\bin 设置到环境变量path中。
启动
(1)首先打开命令提示符,创建一个用于存放数据的目录
md d:\data
(2)启动服务
mongod ‐‐dbpath=d:\data
我们在启动信息中可以看到,mongoDB的默认端口是27017
如果我们想改变默认的启动端口,可以通过--port来指定端口 
在命令提示符输入以下命令即可完成登陆
mongo
退出mongodb
exit

 

服务端 > 指定文件存储的路径: H:\software\MongoDB>   mongod -dbpath=h:\software\MongoDB\data

客户端的开启: 

         连接本机的mongoDB : C:\Users\lisongfeng> mongo  默认连接localhost

         连接服务器上的mongoDB:   mongo 192.168.1.105

 

3. 创建数据库和表  

a.创建数据库,有的话直接使用,没有的话创建

> use spitdb
switched to db spitdb

b.创建表单和插入表单

> db.spit.find()
> db.spit.insert({content:"今天天气真的很好",visit:"10"})
WriteResult({ "nInserted" : 1 })

c.再次查看:如果不指定插入的_id,则产生objectId("....")

> db.spit.find()
{ "_id" : ObjectId("5c47376c7f48bac2e3f29bd9"), "content" : "今天天气真的很好", "visit" : "10" }

d.db.spit.findOne({userid:"1013"}) 根据id进行查询

e.db.spit.find().limit(3); 查询前三条

f.更新操作

   db.spit.update({"_id" : "1"},{visits: 2000});  -- 这种设置会将其他的值置为空

正确的设置

    db.spit.update({"_id" : "1"},{$set : {visits : NumberInt(2000)}})

g.删除操作

    db.spit.remove({"_id":"1"});  -- 根据id进行删除

    db.spit.remove({});  -- 删除全部

h.查询数量

     db.spit.count();  -- 查询全部

     db.spit.count({"userId":"1013"})  -- 查询用户id为1013的数据

i.模糊查询

    db.spit.find({content : /流量/})    内容包含流量的

    db.spit.find({content : /^流量/})  以流量开头的内容

j. 大于、小于、包含

db.spit.find({visits : {$gt : 1500}})   大于

  db.spit.find({userid : {$in : ["1013","1014"]}})  包含

db.spit.find({$or : [{userId : "1013"},{visits : {$lt : 2000}}]})

k.列值增长

 db.spit.update({_id : "2"},{$inc : {visits: NumberInt(1)}})

 

4.代码实现mongoDB相关 -- 简单查询

mongodb-driver是mongo官方推出的java连接mongoDB的驱动包,相当于JDBC驱动。 

 <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 mongoClient = new MongoClient("192.168.1.105");
        //      得到要操作的数据库
        MongoDatabase spitdb = mongoClient.getDatabase("spitdb");
        //      得到要操作的集合
        MongoCollection<Document> spit = spitdb.getCollection("spit");
        //      得到集合中所有的文档
        FindIterable<Document> documents = spit.find();
        //      遍历数据
        for (Document document : documents) {
            System.out.println("内容:" + document.getString("content"));
//            System.out.println("用户id:" + document.getString("userid"));
            System.out.println("访问量:" + document.getString("visit"));
        }
        mongoClient.close();
    }

条件查询

 //      连接mongo服务器
        MongoClient mongoClient = new MongoClient("192.168.1.105");
        //      得到要操作的数据库
        MongoDatabase spitdb = mongoClient.getDatabase("spitdb");
        //      得到要操作的集合
        MongoCollection<Document> spit = spitdb.getCollection("spit");
        //      得到集合中所有的文档

        //      封装条件只查询用户id为1013的
//        BasicDBObject bson = new BasicDBObject("userid","1013");
//      查询点赞大于10的,find({visits : {$gt:10}})
        BasicDBObject bson = new BasicDBObject("visit",new BasicDBObject("$gt" ,10));

        FindIterable<Document> documents = spit.find(bson);
        //      遍历数据
        for (Document document : documents) {
            System.out.println("内容:" + document.getString("content"));
//            System.out.println("用户id:" + document.getString("userid"));
            System.out.println("访问量:" + document.getInteger("visit"));
        }
        mongoClient.close();

相关依赖和代码请参照:

 git@gitee.com:SmileLsf/mongoDB_demo.git 


SpringDataMongoDB 开启敏捷开发

官网主页: https://projects.spring.io/spring-data-mongodb/

1.

server:
  port: 9006
spring:
  application:
    name: tensquare-spit  #指定服务名
  data:
    mongodb:
      host: 192.168.1.105
      database: spitdb  #数据库名称

2.新建吐槽实体类需要注意,id需要添加下划线

@Id
private String _id;

3.dao层

public interface SpitDao extends MongoRepository<Spit,String> {
}

4.service层类似于jpa的写法

5.突出的一个功能:吐槽点赞、控制点赞不能重复

使用RedisTemplate控制点赞的次数不能重复

/**
     * 吐槽点赞,控制只能点赞一次
     */
    @RequestMapping(value="/thumbup/{spitId}",method = RequestMethod.PUT)
    public Result thumbup(@PathVariable String spitId){
        // 暂时做固定处理
        String userId = "123";
        if (redisTemplate.opsForValue().get("thumbup_"+userId+"_"+ spitId) != null) {
            return new Result(false,StatusCode.ERROR,"不能重复点赞");
        }
        spitService.thumbup(spitId);
        redisTemplate.opsForValue().set("thumbup_"+userId+"_"+ spitId,1);
        return new Result(true,StatusCode.OK,"点赞成功");
    }

使用mongoTemplate的原生的方法进行的点赞的累加,当然可以使用先查询后更新的方法

    /**
     * 点赞
     * @param spitId
     */
    public void thumbup(String spitId){
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(spitId));
        Update update = new Update();
        update.inc("thumbup",1);
        mongoTemplate.updateFirst(query,update,"spit");
    }

第二个突出的功能:新增时,给父节点的评论数新增1

    public void save(Spit spit){
        spit.set_id(idWorker.nextId() + "");
        spit.setComment(0);
        spit.setPublishtime(new Date());
        spit.setShare(0);
        spit.setThumbup(0);
        spit.setVisits(0);

        if (spit.getParentid() != null && !"".equals(spit.getParentid())) {
            Query query = new Query();
            query.addCriteria(Criteria.where("_id").is(spit.getParentid()));
            Update update = new Update();
            update.inc("comment",1);
            mongoTemplate.updateFirst(query,update,"spit");
        }
        spitDao.save(spit);
    }

 

 

 

 

 

 

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值