文章目录
- 文档型数据库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. 简介
- 面向文档的非关系型数据库
- 是最接近关系型的非关系型数据库
- 支持的数据机构非常松散,类似JSON的BSON格式,因此可存储比较复杂的数据类型
2. 特点(了解)
支持的查询语言非常强大,其语法类似于面向对象的查询语言,是面向集合的、模式自由的文档型数据库
- 面向集合存储,易于存储对象类型的数据
- 模式自由
- 支持动态查询
- 支持完全索引,包含内部对象
- 支持复制和故障恢复
- 使用高效的二进制的形式存储,包括大型对象(如视频等)
- 自动处理碎片,以支持云计算层次的扩展
- 支持多种语言的驱动程序
- 存储格式为BSON(JSON 的扩展)
3. 体系结构
>mongodb 的逻辑结构是一种层次结构,由文档(document)、集合(collection)、数据库(database)三部分组成。
逻辑结构是面向用户的,用户使用MongoDB开发过程就是使用的逻辑结构。
- 文档相当于关系数据库中的一条记录
- 多个文档组成一个集合,相当于关系数据库中的一张表
- 多个集合逻辑上组合在一起,就是数据库
- 一个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. 基本命令
- 创建数据库
use 数据库名
- 插入文档
数据库名.集合名.insert(数据);
- 查询集合
数据库名.集合名.find();
数据库名.集合名.find({"_id":id值});
数据库名.集合名.find(bson串);
##查询第一条
数据库名.集合名.findOne(bson串);
##查询指定条件下的前n调记录
数据库名.集合名.findOne(bson串).limit(n);
##模糊查询,查找name包含伟的记录,注意此处用的是正则表达式
数据库名.集合名.find({"name":/伟/});
- 修改文档
##注意此方式会将原数据的其他内容删掉,只保留修改的数据
数据库名.集合名.update(条件, 修改后的数据); db.spit.update({"_id":"1"},{"name":"a"});
##注意此方式会将原数据的其他内容保留,只更新所要修改的数据
数据库名.集合名.update(条件, {$set:修改后的数据}); db.spit.update({"_id":"1"},{$set:{"name":"a"}});
- 删除文档
数据库名.集合名.remove(条件); db.spit.remove({_id:"1"});
##注意此方式会将所有数据删除
数据库名.集合名.remove({});
- 其他操作
##统计记录条数
数据库名.集合名.count();
##统计条件下的记录条数
数据库名.集合名.count(条件); db.spit.count({"_id":"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
- 包含、不包含
数据库名.集合名.find({"field" : {$in : value}}); //注意value可以是数组
数据库名.集合名.find({"field" : {$nin : value}});
- 条件连接
数据库名.集合名.find($and:[{"field" : value},{"field" : value}]);
数据库名.集合名.find($or:[{"field" : value},{"field" : value}]);
- 列值增长
数据库名.集合名.update(条件,指定增长);
#如 表示将id为2的记录的visits的值加1
db.spit.update({"_id":"2"},{$inc:{"visits": NumberLong(1)}})
6. java操作MongoDB
mongodb-driver java连接MongoDB的驱动包,类似于jdbc驱动
具体实现方式
- 导入依赖
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
</dependency>
- 操作
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> {}