文章目录

  • 文档型数据库MongoDB(多应用于大数据)
  • 1. 简介
  • 2. 特点(了解)
  • 3. 体系结构
  • 4. 数据类型
  • 5. 基本命令
  • 6. java操作MongoDB
  • 7. SpringDataMongoDB在springboot中的应用
  • 7.1 pom文件
  • 7.2 配置文件application.yml
  • 7.3 entity实体
  • 7.4 controller控制层
  • 7.5 service 业务层
  • 7.6 repository持久层


文档型数据库MongoDB(多应用于大数据)

关系型:表与表之间有关系
非关系型:表与表之间没有关系

一般情况下,具有以下特点的数据适合使用MongoDB数据库来存储

数据量大

数据价值低

写入操作频繁

1. 简介

  1. 面向文档的非关系型数据库
  2. 是最接近关系型的非关系型数据库
  3. 支持的数据机构非常松散,类似JSON的BSON格式,因此可存储比较复杂的数据类型

2. 特点(了解)

支持的查询语言非常强大,其语法类似于面向对象的查询语言,是面向集合的、模式自由的文档型数据库

  1. 面向集合存储,易于存储对象类型的数据
  2. 模式自由
  3. 支持动态查询
  4. 支持完全索引,包含内部对象
  5. 支持复制和故障恢复
  6. 使用高效的二进制的形式存储,包括大型对象(如视频等)
  7. 自动处理碎片,以支持云计算层次的扩展
  8. 支持多种语言的驱动程序
  9. 存储格式为BSON(JSON 的扩展)

3. 体系结构

>mongodb 的逻辑结构是一种层次结构,由文档(document)、集合(collection)、数据库(database)三部分组成。
逻辑结构是面向用户的,用户使用MongoDB开发过程就是使用的逻辑结构。
  1. 文档相当于关系数据库中的一条记录
  2. 多个文档组成一个集合,相当于关系数据库中的一张表
  3. 多个集合逻辑上组合在一起,就是数据库
  4. 一个MongoDB实例支持多个数据库

4. 数据类型

基本数据类型:

  • null:用于表示空值或者不存在的字段,如{“x”:null}
  • 布尔值:true和false
  • 数值:默认使用64位浮点型,如{“x”:3.14}或{“x”: 3},对于整型,可使用NumberInt(4字节)或NumberLong(8字节),如{“x”:NumbreInt(“3”)}
  • 字符串:utf-8类型的字符都可表示
  • 日期:被存储为自新纪元依赖经过的毫秒数,不包含时区,如{“x”:new Date()}
  • 正则表达式:查询时,使用其作为限定条件,语法与JavaScript的相同,如{“x”?[abc]/}
  • 数组: 数组列表或数据集 如{“x”:[“a”,“b”,“c”]}
  • 内嵌文档:文档可嵌套其他文档,被嵌套的文档作为值来处理,如{“x”:{“y”:3}}
  • 对象id:对象id是一个12字节的字符串,是文档的唯一标志,如{“x”:objectId()}
  • 二进制数据:是任意字节的字符串,不能直接使用,若要讲非utf-8的字符串保存,只能通过二进制的格式
  • 代码:查询和文档中可包含任意js代码,如{“x”:function(){/…/}}

5. 基本命令

  1. 创建数据库
use 数据库名
  1. 插入文档
数据库名.集合名.insert(数据);
  1. 查询集合
数据库名.集合名.find();
数据库名.集合名.find({"_id":id值});
数据库名.集合名.find(bson串);
##查询第一条
数据库名.集合名.findOne(bson串); 
##查询指定条件下的前n调记录
数据库名.集合名.findOne(bson串).limit(n); 
##模糊查询,查找name包含伟的记录,注意此处用的是正则表达式
数据库名.集合名.find({"name":/伟/});
  1. 修改文档
##注意此方式会将原数据的其他内容删掉,只保留修改的数据
数据库名.集合名.update(条件, 修改后的数据); db.spit.update({"_id":"1"},{"name":"a"});
##注意此方式会将原数据的其他内容保留,只更新所要修改的数据
数据库名.集合名.update(条件, {$set:修改后的数据}); db.spit.update({"_id":"1"},{$set:{"name":"a"}});
  1. 删除文档
数据库名.集合名.remove(条件); db.spit.remove({_id:"1"});
##注意此方式会将所有数据删除
数据库名.集合名.remove({});
  1. 其他操作
##统计记录条数
数据库名.集合名.count(); 
##统计条件下的记录条数
数据库名.集合名.count(条件); db.spit.count({"_id":"1"});
  1. 大于、小于、不等于
数据库名.集合名.find({"field" : {$gt : value}}); //大于 field > value
数据库名.集合名.find({"field" : {$lt : value}}); //小于 field < value
数据库名.集合名.find({"field" : {$gte : value}}); //大于等于 field >= value
数据库名.集合名.find({"field" : {$lte : value}}); //小于等于 field <= value
数据库名.集合名.find({"field" : {$ne : value}}); //不等于 field != value
  1. 包含、不包含
数据库名.集合名.find({"field" : {$in : value}}); //注意value可以是数组
数据库名.集合名.find({"field" : {$nin : value}});
  1. 条件连接
数据库名.集合名.find($and:[{"field" : value},{"field" : value}]); 
数据库名.集合名.find($or:[{"field" : value},{"field" : value}]);
  1. 列值增长
数据库名.集合名.update(条件,指定增长);
#如 表示将id为2的记录的visits的值加1
db.spit.update({"_id":"2"},{$inc:{"visits": NumberLong(1)}})

6. java操作MongoDB

mongodb-driver java连接MongoDB的驱动包,类似于jdbc驱动

具体实现方式

  1. 导入依赖
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver</artifactId>
</dependency>
  1. 操作
public class A{
    public static void main(String[] args) {
         //连接MongoDB服务器,默认端口为27017
         MongoClient client = new MongoClient("localhost");
         //得到要操作的数据库
         MongoDatabase database = client.getDatabase("databaseName");
         //得到要操作的集合
         MongoCollection<Document> collectonName = database.getCollection("collectonName");
         //得到集合中的所有文档
         FindIterable<Document> documents = collectonName.find();
         //遍历数据
         for (Document doc : documents){
             System.out.println(doc);
         }
         client.close();
     } 
}

7. SpringDataMongoDB在springboot中的应用

7.1 pom文件

导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

7.2 配置文件application.yml

server:
  port: 8006
spring:
  application:
    name: pro-spit
  data:
    mongodb:
      host: localhost
      database: spitdb

7.3 entity实体

在MongoDB中主键不能写为id,需写为_id

7.4 controller控制层

暂无

7.5 service 业务层

对于涉及某个整型字段的自增操作,实现方式有两种

public class A{
    public void update(int num, String id, String key){
    //        方式一、效率低
    //        Spit spit = spitRepository.findById(id).get();
    //        spit.setThumbup(spit.getThumbup() + num);
    //        spitRepository.save(spit);
    //        方式二、使用MongoDB原生的自增命令来实现
    //        db.spit.update({"_id":"2"},{$inc:{"thumbup": NumberInt(1)}})
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(id));
        Update update = new Update();
        update.inc(key, num);
        mongoTemplate.updateFirst(query, update, "spit");
 }
}

7.6 repository持久层

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

参考:
结合springcloud项目学习