经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MongoDB » 查看文章
Spring Boot MongoDB
来源:cnblogs  作者:废物大师兄  时间:2022/1/17 11:00:10  对本文有异议

1.  Linux下启动MongoDB并使用mongosh连接

启动方式有两种:

  • systemctl start mongod
  • mongod  <选项参数>

启动的时候有可能会报类似如下的错误

ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=14)

mongod.service: Control process exited, code=exited status=14

当看到这种“code=exited, status=14”的时候,一般是文件或目录权限问题,即执行mongodb启动命令的用户对某些文件或目录没有访问权限,此时应检查一些几个文件或目录:

  • /var/run/mongodb/
  • /var/log/mongodb/
  • /var/lib/mongo/
  • /tmp/*.sock

看看这些文件或目录的所有者和所属组是否正确

  1. chown -R mongodb:mongodb /var/lib/mongodb
  2. chown -R mongodb:mongodb /var/log/mongodb/
  3. chown -R mongodb:mongodb /var/run/mongodb/
  4. chown mongodb:mongodb /tmp/mongodb-27017.sock

首先,不启用访问控制,创建一个用户管理员

然后,启用访问控制,用用户管理员认证,再创建其它用户

备忘录

  1. ls -l /var/run/mongodb/
  2. ls -l /var/log/mongodb/
  3. ls -l /var/lib/mongo/
  4. ls -l /tmp/*.sock
  5. id
  6. rm -rf /tmp/mongodb-27017.sock
  7. systemctl start mongod
  8. mongosh
  9. test> use admin
  10. admin> db.createUser(
  11. {
  12. user: "myUserAdmin",
  13. pwd: passwordPrompt(),
  14. roles: [
  15. { role: "userAdminAnyDatabase", db: "admin" },
  16. { role: "readWriteAnyDatabase", db: "admin" }
  17. ]
  18. }
  19. )
  20. sudo vim /etc/mongod.conf
  21. sudo systemctl restart mongod
  22. mongosh --port 27017 --authenticationDatabase "admin" -u "myUserAdmin" -p
  23. test> use book
  24. switched to db book
  25. book> db.chinese.insertOne({title:"语文"})
  26. test> use admin
  27. switched to db admin
  28. admin> db.auth("myUserAdmin","123456")
  29. { ok: 1 }
  30. admin> use book
  31. switched to db book
  32. book> db.createUser({user:"zhangsan",pwd:"123456",roles:[{role:"readWrite",db:"book"}]})
  33. { ok: 1 }
  34. book> db.auth("zhangsan","123456")
  35. { ok: 1 }
  36. book> show collections

2.  Docker 运行 MongoDB

方式一:另启一个容器去连接(PS:相当于远程连接)

  1. docker run -d --network my-network --name my-mongo -e MONGO_INITDB_ROOT_USERNAME=mongoroot -e MONGO_INITDB_ROOT_PASSWORD=123456 -v /data/mongo/db:/data/db -p 27017:27017 mongo
  2. docker run -it --rm --network my-network mongo mongosh --host my-mongo -u mongoroot -p 123456 --authenticationDatabase admin

方式二:从运行MongoDB实例的容器内部进行连接(PS:相当于本地连接)

  1. docker run -d --network my-network --name my-mongo -e MONGO_INITDB_ROOT_USERNAME=mongoroot -e MONGO_INITDB_ROOT_PASSWORD=123456 -v /data/mongo/db:/data/db -p 27017:27017 mongo
  2. docker exec -it my-mongo mongosh

备忘录

  1. docker run -d --network my-network --name my-mongo -e MONGO_INITDB_ROOT_USERNAME=mongoroot -e MONGO_INITDB_ROOT_PASSWORD=123456 -v /data/mongo/db:/data/db -p 27017:27017 mongo
  2. docker run -it --rm --network my-network mongo mongosh --host my-mongo -u mongoroot -p 123456 --authenticationDatabase admin
  3. docker exec -it my-mongo mongosh
  4. docker run -it --rm mongo mongosh --help
  5. docker exec -it some-mongo bash
  6. docker logs -f some-mongo
  7. docker exec -it my-mongo mongosh
  8. use admin
  9. db.auth("myUserAdmin","123456")
  10. db.createUser({user:"hello",pwd:"world",roles:[{role:"readWrite",db:"movie"}]})

补充

不建议用root用户来运行MongoDB

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

3.  Spring Boot 集成 MongoDB

maven依赖

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

完整的pom.xml如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.6.2</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.cjs.example</groupId>
  12. <artifactId>demo-mongodb</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>demo-mongodb</name>
  15. <properties>
  16. <java.version>1.8</java.version>
  17. </properties>
  18. <dependencies>
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-web</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.projectlombok</groupId>
  29. <artifactId>lombok</artifactId>
  30. <optional>true</optional>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-test</artifactId>
  35. <scope>test</scope>
  36. </dependency>
  37. </dependencies>
  38. <build>
  39. <plugins>
  40. <plugin>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-maven-plugin</artifactId>
  43. <configuration>
  44. <excludes>
  45. <exclude>
  46. <groupId>org.projectlombok</groupId>
  47. <artifactId>lombok</artifactId>
  48. </exclude>
  49. </excludes>
  50. </configuration>
  51. </plugin>
  52. </plugins>
  53. </build>
  54. </project>

application.yml

  1. spring:
  2. data:
  3. mongodb:
  4. host: 192.168.28.32
  5. port: 27017
  6. database: movie
  7. username: hello
  8. password: world
  9. # uri: mongodb://192.168.28.32:27017

连接字符串格式,参见  https://docs.mongodb.com/manual/reference/connection-string/

方式一:MongoTemplate

首先,定义一个实体类

  1. package com.cjs.example.domain;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import org.springframework.data.annotation.Id;
  6. import org.springframework.data.mongodb.core.index.Indexed;
  7. import org.springframework.data.mongodb.core.mapping.Document;
  8. import java.io.Serializable;
  9. import java.util.List;
  10. /**
  11. * @Author ChengJianSheng
  12. * @Date 2022/1/12
  13. */
  14. @Data
  15. @NoArgsConstructor
  16. @AllArgsConstructor
  17. @Document(collection = "film")
  18. public class Film implements Serializable {
  19. @Id
  20. private String id;
  21. private String name;
  22. private List<String> category;
  23. }

然后,利用MongoTemplate进行操作

  1. package com.cjs.example;
  2. import com.cjs.example.domain.Film;
  3. import com.cjs.example.repository.FilmRepository;
  4. import org.junit.jupiter.api.Test;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6. import org.springframework.data.mongodb.core.MongoTemplate;
  7. import org.springframework.data.mongodb.core.query.Criteria;
  8. import org.springframework.data.mongodb.core.query.Query;
  9. import javax.annotation.Resource;
  10. import java.util.Arrays;
  11. import java.util.List;
  12. @SpringBootTest
  13. class DemoMongodbApplicationTests {
  14. @Resource
  15. private MongoTemplate mongoTemplate;
  16. /**
  17. * movie> db.createUser({user:"hello",pwd:"world",roles:["readWrite"]})
  18. */
  19. @Test
  20. void contextLoads() {
  21. Film film = new Film();
  22. film.setName("我和我的父辈");
  23. film.setCategory(Arrays.asList("剧情"));
  24. mongoTemplate.insert(film);
  25. }
  26. @Test
  27. void testQuery() {
  28. List<Film> filmList = mongoTemplate.findAll(Film.class);
  29. System.out.println(filmList);
  30. Query query = new Query();
  31. query.addCriteria(Criteria.where("name").is("我和我的父辈").and("category").in("爱情","战争","剧情"));
  32. Film film = mongoTemplate.findOne(query, Film.class);
  33. System.out.println(film);
  34. }
  35. @Test
  36. void testSave() {
  37. Film film = new Film();
  38. film.setId("asdfgh");
  39. film.setName("长津湖");
  40. film.setCategory(Arrays.asList("战争","历史"));
  41. mongoTemplate.save(film);
  42. }
  43. }

方式二:Spring Data MongoDB Repositories 

定义一个Repository

  1. package com.cjs.example.repository;
  2. import com.cjs.example.domain.Film;
  3. import org.springframework.data.repository.CrudRepository;
  4. import java.util.List;
  5. /**
  6. * @Author ChengJianSheng
  7. * @Date 2022/1/12
  8. */
  9. public interface FilmRepository extends CrudRepository<Film, String> {
  10. List<Film> findByName(String name);
  11. }

完整测试代码如下:

  1. package com.cjs.example;
  2. import com.cjs.example.domain.Film;
  3. import com.cjs.example.repository.FilmRepository;
  4. import org.junit.jupiter.api.Test;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6. import org.springframework.data.mongodb.core.MongoTemplate;
  7. import org.springframework.data.mongodb.core.query.Criteria;
  8. import org.springframework.data.mongodb.core.query.Query;
  9. import javax.annotation.Resource;
  10. import java.util.Arrays;
  11. import java.util.List;
  12. @SpringBootTest
  13. class DemoMongodbApplicationTests {
  14. @Resource
  15. private MongoTemplate mongoTemplate;
  16. @Resource
  17. private FilmRepository filmRepository;
  18. /**
  19. * movie> db.createUser({user:"hello",pwd:"world",roles:["readWrite"]})
  20. */
  21. @Test
  22. void contextLoads() {
  23. Film film = new Film();
  24. film.setName("我和我的父辈");
  25. film.setCategory(Arrays.asList("剧情"));
  26. mongoTemplate.insert(film);
  27. }
  28. @Test
  29. void testQuery() {
  30. List<Film> filmList = mongoTemplate.findAll(Film.class);
  31. System.out.println(filmList);
  32. Query query = new Query();
  33. query.addCriteria(Criteria.where("name").is("我和我的父辈").and("category").in("爱情","战争","剧情"));
  34. Film film = mongoTemplate.findOne(query, Film.class);
  35. System.out.println(film);
  36. }
  37. @Test
  38. void testSave() {
  39. Film film = new Film();
  40. film.setId("asdfgh");
  41. film.setName("长津湖");
  42. film.setCategory(Arrays.asList("战争","历史"));
  43. mongoTemplate.save(film);
  44. }
  45. @Test
  46. void testSaveByRepository() {
  47. filmRepository.save(new Film("1234", "火影忍者", Arrays.asList("动画","喜剧","动作","冒险")));
  48. }
  49. @Test
  50. void testQueryByRepository() {
  51. Film film = filmRepository.findById("1234").orElse(null);
  52. System.out.println(film);
  53. film = filmRepository.findByName("火影忍者").get(0);
  54. System.out.println(film);
  55. filmRepository.findAll().forEach(System.out::println);
  56. }
  57. }

工程结构如下:

原文链接:http://www.cnblogs.com/cjsblog/p/15795184.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号