1.概念:
(1)MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统
(2)MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最
丰富,最像关系数据库的
(3)在高负载的情况下,添加更多的节点,可以保证服务器性能
(4)MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案
(5)MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类
似于 JSON 对象。字段值可以包含其他文档,数组及文档数组
2.官网安装:
mongodb官网链接:MongoDB Documentation
docker安装:可在Linux或服务器上装
官网链接(以英文为主)==>Install Docker Engine on CentOS | Docker Documentation
可使用docker容器,拉取mongodb,并启动
操作如下:输入Linux命令
(1)拉取镜像:docker pull mongo:latest(默认拉取最新的)
(2)创建和启动容器:-d(后台启动)、-p(端口映射启动)、-v(绑定一个卷)
docker run -d --restart=always -p 27017:27017 --name mymongo -v /data/db:/data/db -d mongo
(3)进入容器:docker exec -it mymongo /bin/bash
(4)使用MongoDB客户端进行操作:mongo
3.MongoDB数据库常用命令:
查看命令提示:db.help()
1.查询所有数据库 : show dbs
2.切换/创建数据库 :use 数据库名
3.删除当前使用数据库 : db.dropDatabase()
4.查看当前使用的数据库 :db.getName()
5.创建一个集合(table):db.createCollection("集合名")
db.getCollection("集合名") //获取指定集合
6.添加User数据 :db.User.save({数据1:'数据1',数据2:数据2,...:....})
7.查看User数据 :
db.User.find()
db.User.find({数据1:'数据1'}) //where条件,查看数据
db.User.find({数据1:'数据1'},{'数据1':1,'数据2':1}) //where条件,查看指定数据
db.User.find().sort({数据:1}) //查看数据排序(1:升序,-1:降序)
db.User.find().skip(0).limit(3) //跳过指定行查看数据
db.User.find({age:{$in:[21,22,23]}}) //选中某一条件查看数据
8.更新数据 :db.User.update({数据1:'数据1'},{$set:{数据1:新数据,...:...}})
9.删除数据 :db.User.remove(id) //移除对应id行
db.User.remove({}) //移除所有
10.给数据添加索引:db.User.createIndex({"name":1})
4.适用场景:
1.网站数据:
Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸性。
2.缓存:
由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的
持久化缓存层可以避免下层的数据源过载。
3.大尺寸,低价值的数据:
使用传统的关系型数据库存储一些数据时可能会比较昂贵, 在此之前,很多时候程序员往往
会选择传统的文件进行存储。
4.高伸缩性的场景:
Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对
Map Reduce弓摩的内置支持。
5.用于对象及 JSON数据的存储:
Mongo的BSON数据格式非常适合文档化格式的存储 及查询。
5.不适场景:
1.高度事务性的系统:
例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用
程序。
2.传统的商业智能应用:
针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合
适的选择。
6.SpringBoot集成MongoDB
(6.1)pom.xml文件:
<!--引入mongodb依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
(6.2)application.yml文件:
spring: data: mongodb: uri: mongodb://127.0.0.1:27017/test
(6.3)主启动类:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * 主启动类 */ @SpringBootApplication public class MongoDBMainApplication { public static void main(String[] args) { SpringApplication.run(MongoDBMainApplication.class,args); } }
(6.4)业务编写:
entity:实体类
import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; @Data @Document("User") //mongodb文档存储 public class User { @Id private String id; private String name; private Integer age; private String email; private String createDate; }
repository:实现mongodb存储接口类
import com.haihui.mongodb.entity.User; import org.springframework.data.mongodb.repository.MongoRepository; /** * MongoRepository实现类 */ public interface UserRepository extends MongoRepository<User,String> { }
(6.5)业务测试:
MongoTemplate对象:操作mongodb存储
import com.haihui.mongodb.entity.User; import com.mongodb.client.result.DeleteResult; import com.mongodb.client.result.UpdateResult; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;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 java.util.List; import java.util.regex.Pattern; /** * mongoTemplate测试 */ @SpringBootTest public class MongoApplicationTest01 { /** * 注入mongoTemplate */ @Autowired private MongoTemplate mongoTemplate; /** * 添加操作 */ @Test public void createUser() { User user = new User(); user.setAge(20); user.setName("test"); user.setEmail("4932200@qq.com"); User user1 = mongoTemplate.insert(user); System.out.println(user1); } /** * 查询所有记录 */ @Test public void findAll(){ List<User> allUser = mongoTemplate.findAll(User.class); System.out.println(allUser); } /** * id查询 */ @Test public void findId(){ User user = mongoTemplate.findById("60d85c7d0efeab4559ab9fff", User.class); System.out.println(user); } /** * 条件查询 */ @Test public void findUserList(){ //name=test and age =20 Query query = new Query(Criteria .where("name").is("test") .and("age").is(20) ); List<User> userList = mongoTemplate.find(query, User.class); System.out.println(userList); } /** * 模糊查询 */ @Test public void findLikeUserList(){ //name like test String name = "est"; String regex = String.format("%s%s%s",".*",name,".*$"); //正则表达规则 Pattern pattern = Pattern.compile(regex,Pattern.CASE_INSENSITIVE); Query query = new Query(Criteria .where("name").regex(pattern) ); List<User> users = mongoTemplate.find(query, User.class); System.out.println(users); } /** * 分页查询 */ @Test public void findPageUserList(){ int pageNo = 1; int pageSize = 3; String name = "est"; //条件构建 String regex = String.format("%s%s%s",".*",name,".*$"); //正则表达规则 Pattern pattern = Pattern.compile(regex,Pattern.CASE_INSENSITIVE); Query query = new Query(Criteria .where("name").regex(pattern) ); //分页构建 //查询记录数 long count = mongoTemplate.count(query,User.class); //分页 List<User> users = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class); System.out.println(count); System.out.println(users); } /** * 修改 */ @Test public void updateUser(){ //根据id查询 User user = mongoTemplate.findById("60d85c7d0efeab4559ab9fff",User.class); //设置修改值 user.setName("test_1"); user.setAge(50); user.setEmail("0000@qq.com"); //调用方法实现修改 Query query = new Query(Criteria.where("_id").is(user.getId())); Update update = new Update(); update.set("name",user.getName()); update.set("age",user.getAge()); update.set("email",user.getEmail()); UpdateResult upsert = mongoTemplate.upsert(query, update, User.class); long modifiedCount = upsert.getModifiedCount(); System.out.println(modifiedCount); } /** * 删除 */ @Test public void deleteUser(){ Query query = new Query(Criteria.where("_id").is("60d85c7d0efeab4559ab9fff")); DeleteResult remove = mongoTemplate.remove(query, User.class); long deletedCount = remove.getDeletedCount(); System.out.println(deletedCount); } }
UserRepository对象:操作mongodb存储(自定类实现了MongoRepository<User,String>接口类)
import com.haihui.mongodb.entity.User; import com.haihui.mongodb.repository.UserRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.*; import java.util.List; /** * mongoRepository测试 */ @SpringBootTest public class MongoApplicationTest02 { /** * 注入UserRepository */ @Autowired private UserRepository userRepository; /** * 添加操作 */ @Test public void createUser() { User user = new User(); user.setName("lucy"); user.setAge(30); user.setEmail("12311@qq.com"); User user1 = userRepository.save(user); System.out.println(user1); } /** * 查询所有记录 */ @Test public void findAll(){ List<User> userAllList = userRepository.findAll(); System.out.println(userAllList); } /** * id查询 */ @Test public void findId(){ User user = userRepository.findById("60d93b8db4197970e959b082").get(); System.out.println(user); } /** * 条件查询 */ @Test public void findUserList(){ //name=lucy and age=30 User user = new User(); user.setName("mary"); user.setAge(30); Example<User> userExample = Example.of(user); List<User> userList = userRepository.findAll(userExample); System.out.println(userList); } /** * 模糊查询 */ @Test public void findLikeUserList(){ //设置模糊查询匹配规则 ExampleMatcher matcher = ExampleMatcher.matching() .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)//设置为模糊查询 .withIgnoreCase(true);//忽略大小写 User user = new User(); user.setName("m"); Example<User> userExample = Example.of(user, matcher); List<User> userList = userRepository.findAll(userExample); System.out.println(userList); } /** * 分页查询 */ @Test public void findPageUserList(){ //设置分页参数: //0:第一页 Pageable pageable = PageRequest.of(0, 3); User user = new User(); user.setName("mary"); Example<User> userExample = Example.of(user); Page<User> page = userRepository.findAll(userExample,pageable); System.out.println(page); } /** * 修改 */ @Test public void updateUser(){ User user = userRepository.findById("60d93b8db4197970e959b082").get(); user.setName("lucy_11"); user.setAge(100); user.setEmail("1@qq.com"); User update = userRepository.save(user);//有id,则修改 System.out.println(update); } /** * 删除 */ @Test public void deleteUser(){ userRepository.deleteById("60d93b8db4197970e959b082"); } }