MongoDB 认识

MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
MongoDB它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。其CRUD语法有点类似于面向对象的查询语言。
MongoDB服务端可运行在Linux、Windows或mac os x平台,支持32位和64位应用,推荐64位,默认端口为27017

MongoDB 主要特点

1.文档

MongoDB中的记录是一个文档(Document),它是由字段和值对组成的数据结构。MongoDB文档类似于JSON对象。字段的值可以包括其他文档,数组和文档数组。
MongoDB详解 - 图1
文档中的值类型不仅可以是双引号中的字符串,也可以是其他的数据类型,例如,整型、布尔型等,也可以是另外一个文档,即文档可以嵌套。文档中的键类型只能是字符串。

2.集合

集合就是一组文档,类似于关系数据库中的表。集合是无模式的,集合中的文档可以是各式各样的。例如,{“helloword”:“Mike”}和{“foo”: 3},它们的键不同,值的类型也不同,但是它们可以存放在同一个集合中。
既然集合中可以存放任何类型的文档,那么为什么还需要使用多个集合?

  • 开发、维护、管理效率?
  • 对集合的CRUD操作效率?
  • 例如,通常对于网站的日志记录,可以根据日志的级别进行存储,Info级别日志存放在Info 集合中,Debug 级别日志存放在Debug 集合中…
  • 可以使用“.”按照命名空间将集合划分为子集合。使用子集合组织数据结构更清晰,如blog下面的blog.userblog.article

    3. 数据库

    一个MongoDB 实例可以承载多个数据库。它们之间可以看作相互独立,每个数据库都有独立的权限控制。在磁盘上,不同的数据库存放在不同的文件中。
    MongoDB 中存在以下系统数据库。

  • Admin 数据库:一个权限数据库,如果创建用户的时候将该用户添加到admin 数据库中,那么该用户就自动继承了所有数据库的权限。

  • Local 数据库:这个数据库永远不会被复制,可以用来存储本地单台服务器的任意集合。
  • Config 数据库:当MongoDB 使用分片模式时,config 数据库在内部使用,用于保存分片的信息。

    安装MongoDB

    Linux上安装MongoDB

    官网地址:https://fastdl.mongodb.org

    1.通过Docker安装:

    https://www.runoob.com/docker/docker-install-mongodb.html

    2.通过安装包安装:

    https://blog.csdn.net/qq_41107231/article/details/108028319
    使用Xftp将压缩包上传到指定目录下
    1. cd /opt/
    2. mkdir mongodb
    3. tar -zxvf mongodb-linux-x86_64-4.0.13 #文件名根据你自己的压缩包文件名来
    创建mongodb数据存储文件和日志文件
    1. cd /opt/mongodb/
    2. mkdir data
    3. mkdir logs
    4. cd ./logs
    5. touch mongodb.log
    6. cd ../
    7. mkdir etc
    8. cd etc
    9. touch mongodb.conf
    mongodb.conf配置文件:
    1. #数据库路径
    2. dbpath=/opt/mongodb/data
    3. #日志输出文件路径
    4. logpath=/opt/mongodb/logs/mongodb.log
    5. #错误日志采用追加模式
    6. logappend=true
    7. #启用日志文件,默认启用
    8. journal=true
    9. #这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
    10. quiet=true
    11. #端口号 默认为27017
    12. port=27017
    13. #允许远程访问
    14. bind_ip=0.0.0.0
    15. #开启子进程
    16. fork=true
    17. #开启认证,必选先添加用户,先不开启(不用验证账号密码)
    18. #auth=true
    将mongodb服务加入环境变量
    vim /etc/profile
    在最后一行添加:
    export PATH=$PATH:/usr/local/mongodb/mongodb-linux-x86_64-amazon-5.0.2/bin #文件名根据你自己的压缩包文件名来
    使配置文件生效:
    source /etc/profile

    Windows上安装MongoDB

    https://www.cnblogs.com/TM0831/p/10606624.html

    启动/关闭mongodb服务

    1.在mongodb的安装目录下的bin目录下启动服务
    ./mongod --config /opt/mongodb/etc/mongodb.conf
    MongoDB详解 - 图2
    2.查看mongodb是否已经启动成功
    netstat -lanp | grep "27017"
    显示如下进程,说明已经成功启动
    MongoDB详解 - 图3
    3.关闭mongodb服务
    db.shutdownServer()

    操作mongo数据库

    任意目录下,输入命令mongo即可进入数据库(配置了环境变量的前提下),否则需要在mongodb安装目录下的bin目录下使用 ./mongo 命令
    显示如下,已经成功进入mongo数据库了,默认是进入的是test数据库show dbs 查看当前所有数据库。
    MongoDB详解 - 图4
    注意:如果一个数据库是没有安全认证的,不使用用户名密码即可登陆,这样是不安全的,所以我们应当授予权限才能操作数据库,这样再企业中才能保证数据安全性。

    添加用户、安全认证

    首先必须使用admin数据库,进行新用户授权.
    MongoDB副本集默认会创建local、admin数据库,local数据库主要存储副本集的元数据,admin数据库则主要存储MongoDB的用户、角色等信息。

use admin
MongoDB详解 - 图5

输入以下命令:
db.createUser({user:"root",pwd:"123456",roles:[{role:"root",db:"admin"}]})
MongoDB详解 - 图6
授权成功后,关闭mongo服务:
db.shutdownServer()
查看mongo服务进程,可看到服务已经成功停掉了. netstat -lanp | grep "27017"
然后需要到配置文件中修改配置,启用安全认证。
MongoDB详解 - 图7

auth=true #开启认证,必选先添加用户
最后开启mongo服务,进入数据库测试:
./mongod --config /opt/mongodb/etc/mongodb.conf
show dbs此时看不到任何数据库,说明我们的安全认证用户配置生效了。
首先使用use admin通过db.auth(‘root’,‘密码’) 输出1就是验证成功。
use admin
db.auth('root','123456')
MongoDB详解 - 图8

MongoDB 的基本操作(增、删、改、查)

参考1:https://blog.csdn.net/nanhuaibeian/article/details/108209689
参考2:https://blog.csdn.net/Alen_Liu_SZ/article/details/100528989

MongoDB 整合Springboot

Mongodb开发文档API: https://docs.spring.io/spring-data/mongodb/docs/2.1.5.RELEASE/api/
参考链接:https://blog.csdn.net/qq_46672746/article/details/118859786

准备数据库

use test#如果数据库不存在,则创建数据库,否则切换到指定数据库
MongoDB详解 - 图9

db.createCollection( "collName");**`**#创建一个集合(table)`

db.getCollection("user");#得到指定名称的集合(table )

  1. #示例:插入
  2. db.User.save({name:‘zhangsan’,age:21,sex:true})
  3. db.User.find()
  4. {"_id": Objectld(“4f69e680c9106ee2ec95da66”), name”: zhangsan”, age”: 21,“sex”: true}

准备环境

引入mongodb依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  4. <version>2.2.1.RELEASE</version>
  5. </dependency>

添加配置

  1. spring.data.mongodb.host=XXX.XXX.XXX.XXX #服务器或虚拟机的IP(192.168.72.20)
  2. spring.data.mongodb.port=27017
  3. spring.data.mongodb.database=yygh_hosp

实体类

  1. @Data
  2. @Document("User")
  3. public class User {
  4. @Id
  5. private String id;
  6. private String name;
  7. private Integer age;
  8. private String email;
  9. private String createDate;
  10. }

一、基于MongoTemplate 开发CRUD

添加、查询所有

  1. @SpringBootTest
  2. class MongodbApplicationTests {
  3. @Autowired
  4. private MongoTemplate mongoTemplate;
  5. //添加
  6. @Test
  7. public void createUser() {
  8. User user = new User();
  9. user.setAge(20);
  10. user.setName("test");
  11. user.setEmail("4932200@qq.com");
  12. User user1 = mongoTemplate.insert(user);
  13. System.out.println(user1);
  14. }
  15. //查询所有
  16. @Test
  17. public void findUser() {
  18. List<User> userList = mongoTemplate.findAll(User.class);
  19. System.out.println(userList);
  20. }
  21. }

其他常用查询

  1. //根据id查询
  2. @Test
  3. public void getById() {
  4. User user =
  5. mongoTemplate.findById("5ffbfa2ac290f356edf9b5aa", User.class);
  6. System.out.println(user);
  7. }
  8. //条件查询
  9. @Test
  10. public void findUserList() {
  11. Query query = new Query(Criteria
  12. .where("name").is("test")
  13. .and("age").is(20));
  14. List<User> userList = mongoTemplate.find(query, User.class);
  15. System.out.println(userList);
  16. }
  17. //模糊查询
  18. @Test
  19. public void findUsersLikeName() {
  20. String name = "est";
  21. String regex = String.format("%s%s%s", "^.*", name, ".*$");
  22. Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
  23. Query query = new Query(Criteria.where("name").regex(pattern));
  24. List<User> userList = mongoTemplate.find(query, User.class);
  25. System.out.println(userList);
  26. }
  27. //分页查询
  28. @Test
  29. public void findUsersPage() {
  30. String name = "est";
  31. int pageNo = 1;
  32. int pageSize = 10;
  33. Query query = new Query();
  34. String regex = String.format("%s%s%s", "^.*", name, ".*$");
  35. Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
  36. query.addCriteria(Criteria.where("name").regex(pattern));
  37. int totalCount = (int) mongoTemplate.count(query, User.class);
  38. List<User> userList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);
  39. Map<String, Object> pageMap = new HashMap<>();
  40. pageMap.put("list", userList);
  41. pageMap.put("totalCount",totalCount);
  42. System.out.println(pageMap);
  43. }

修改

  1. //修改
  2. @Test
  3. public void updateUser() {
  4. User user = mongoTemplate.findById("5ffbfa2ac290f356edf9b5aa", User.class);
  5. user.setName("test_1");
  6. user.setAge(25);
  7. user.setEmail("493220990@qq.com");
  8. Query query = new Query(Criteria.where("_id").is(user.getId()));
  9. Update update = new Update();
  10. update.set("name", user.getName());
  11. update.set("age", user.getAge());
  12. update.set("email", user.getEmail());
  13. UpdateResult result = mongoTemplate.upsert(query, update, User.class);
  14. long count = result.getModifiedCount();
  15. System.out.println(count);
  16. }

删除

  1. //删除操作
  2. @Test
  3. public void delete() {
  4. Query query =
  5. new Query(Criteria.where("_id").is("5ffbfa2ac290f356edf9b5aa"));
  6. DeleteResult result = mongoTemplate.remove(query, User.class);
  7. long count = result.getDeletedCount();
  8. System.out.println(count);
  9. }

二、基于MongoRepository开发CRUD

第一步:创建一个interface继承MongoRepository接口,如下:
image.png
第二步:将接口注入即可使用(@Autowired UserRepository xxx;)
第三步:调用接口的方法,实现CRUD操作

添加

  1. //添加
  2. @Test
  3. public void createUser() {
  4. User user = new User();
  5. user.setAge(20);
  6. user.setName("张三");
  7. user.setEmail("3332200@qq.com");
  8. User user1 = userRepository.save(user);
  9. }

查询

  1. //查询所有
  2. @Test
  3. public void findUser() {
  4. List<User> userList = userRepository.findAll();
  5. System.out.println(userList);
  6. }
  7. //id查询
  8. @Test
  9. public void getById() {
  10. User user = userRepository.findById("5ffbfe8197f24a07007bd6ce").get();
  11. System.out.println(user);
  12. }
  13. //条件查询
  14. @Test
  15. public void findUserList() {
  16. User user = new User();
  17. user.setName("张三");
  18. user.setAge(20);
  19. Example<User> userExample = Example.of(user);
  20. List<User> userList = userRepository.findAll(userExample);
  21. System.out.println(userList);
  22. }
  23. //模糊查询
  24. @Test
  25. public void findUsersLikeName() {
  26. //创建匹配器,即如何使用查询条件
  27. ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
  28. .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
  29. .withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
  30. User user = new User();
  31. user.setName("三");
  32. Example<User> userExample = Example.of(user, matcher);
  33. List<User> userList = userRepository.findAll(userExample);
  34. System.out.println(userList);
  35. }
  36. //分页查询
  37. @Test
  38. public void findUsersPage() {
  39. Sort sort = Sort.by(Sort.Direction.DESC, "age");
  40. //0为第一页
  41. Pageable pageable = PageRequest.of(0, 10, sort);
  42. //创建匹配器,即如何使用查询条件
  43. ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
  44. .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式:模糊查询
  45. .withIgnoreCase(true); //改变默认大小写忽略方式:忽略大小写
  46. User user = new User();
  47. user.setName("三");
  48. Example<User> userExample = Example.of(user, matcher);
  49. //创建实例
  50. Example<User> example = Example.of(user, matcher);
  51. Page<User> pages = userRepository.findAll(example, pageable);
  52. System.out.println(pages);
  53. }

修改

  1. //修改
  2. @Test
  3. public void updateUser() {
  4. User user = userRepository.findById("5ffbfe8197f24a07007bd6ce").get();
  5. user.setName("张三_1");
  6. user.setAge(25);
  7. user.setEmail("883220990@qq.com");
  8. User save = userRepository.save(user);
  9. System.out.println(save);
  10. }

删除

  1. //删除
  2. @Test
  3. public void delete() {
  4. userRepository.deleteById("5ffbfe8197f24a07007bd6ce");
  5. }