简单介绍
分布式文件储存数据库
支持的数据结构类似于Json的Bson格式
最佳优点:查询语言非常强大,类似面向对象的查询语言
支持索引等
调侃:是非关系型数据库中功能最丰富、最像关系型数据库的
docker安装
从下载到安装到启动客户端一气呵成:
docker search mongo
docker pull mongo //下载镜像
docker create --name mongodb -p 27017:27017 -v /ninja_data/mongodb:/data/db mongo:latest //创建容器
docker start mongodb //启动容器
docker exec -it mongodb /bin/bash //进入容器
mongo //使用客户端连接mongodb
show dbs //查看其下的所有数据库
命令行CRUD
就不一一截图了,过一下了解一下就ok
-
先把数据库的一些基本命令说明一下
-
show dbs //查看所有的数据库
-
use testdb // mongo中创建数据库通过use选中的方式自动创建数据库
-
show tables或者 show collections //都是查看当前选中数据库下的所有表
-
db.表名.drop() //删除表
-
db.dropDatabases() //删除当前选中的数据库
-
-
增加数据
-
-
修改数据
-
修改这里得多记下几笔:
-
数据修改以以下为模板,方便大家理解
-
-
-
-
删除数据
-
查询数据
前面大家应该都看到了一个命令:db.user.find(),这是查询user表下所有数据
大致格式为:db.user.find([query],[fields]) ,两个参数均为可选
-
第一个参数:命中的条件,相当于mysql中的where
-
第二个参数:命中数据后返回的数据字段,相当于mysql中的select *
db.col.find().pretty() :prett()会将命中的数据格式化显示,有利于浏览
写两个简单列子,简单阐明一下
-
-
常见的运算表达式如:
-
lt :<
-
lte :<=
-
gt :>
-
gte:=>
-
ne :!=
-
-
-
-
更多的查询语句
mongo索引
索引的作用就不再做多赘述,避免全变扫描带来的低效率的有效解决手段
-
db.user.getIndexes() :查看当前表的索引情况
-
db.user.createIndex({'id':1}) :为字段id 创建索引
-
db.user.dropIndex("id_1") :删除我们刚刚创建的索引,id_1由查看索引信息得到name信息
-
db.user.dropIndexes() :删除除了mongo自带的-id字段外的其他一切索引
-
db.user.createIndex({'age':1, 'id':-1}) :创建联合索引,1表示升序,-1反之
-
db.user.totalIndexSize() :查看缩影大小、单位、字节
mongo执行计划
-
我们就拿这一条数据来做个测试
-
db.user.find({age:{$lte:25}, id:{$gte:2}}).explain()
-
我们可以看到在执行计划下部分有个属性:winingPlan,这才是我们看的地方
-
第一个属性 "stage":" "
-
COLLSCAN:全表扫描
-
IXSCAN:索引扫描
-
FETCH:根据索引去检索文档
-
SHARD_MERGE:合并分片结果
-
IDHACK:针对_id进行查询
-
-
-
SpringBoot整合API
-
SpringBoot对mongo做了整合,下面简单了解一下相关API
-
这次我分别对两种方式都做了简单的CRUD
-
第一种方式,也就是我们Spring Data的惯用方式,写接口继承对应接口,按照一定的命名方式自动生成sql,完成简单的单表CRUD
-
第二中方式,我们引入 MongoTemplate,实现对mongo数据的操作
-
项目依赖:pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
项目配置文件:aplication.yml
server: port: 8080 spring: application: name: mongoDemo data: mongodb: uri: mongodb://192.168.0.150:27017 database: testdb
项目实体类:Person
package com.example.demo.vo; import lombok.*; import org.springframework.data.annotation.Id; @Data @AllArgsConstructor @NoArgsConstructor @ToString public class Person { @Id private Integer id; private String name; private Integer age; }
第一种方式:MongoTemplate
-
代码写的很松散,只为测试用,不要介意
package com.example.demo.Dao; import com.example.demo.vo.Person; import com.mongodb.client.result.DeleteResult; import com.mongodb.client.result.UpdateResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Component; import java.util.List; @Component public class PersonDao { @Autowired private MongoTemplate mongoTemplate; //增加 public void testInsert(Person person){ mongoTemplate.save(person); System.out.println("保存数据成功"); } //构建条件查询器根据条件查询 public List<Person> testQueryListByName(String name){ /*构建查询条件*/ Query query = Query.query(Criteria.where("name").is(name)); return mongoTemplate.find(query, Person.class); } //分页查询 public List<Person> testQueryPersonListPage(Integer page,Integer size){ Query query = new Query().limit(size).skip((page - 1) * size); return mongoTemplate.find(query, Person.class); } //修改 public UpdateResult updateById(Person person){ Query query = Query.query(Criteria.where("_id").is(person.getId())); Update update = Update.update("age",person.getAge()); update.set("name", person.getName()); return mongoTemplate.updateFirst(query, update,Person.class); } //删除 public DeleteResult testDeleteById(Integer id){ Query query = Query.query(Criteria.where("id").is(id)); return mongoTemplate.remove(query, Person.class); } }
-
第二种方式:extends MongoRepository<Person,Integer>
package com.example.demo; import com.example.demo.vo.Person; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Component; @Component public interface repository extends MongoRepository<Person,Integer> {
}
-
最后一式两份的