spring boot MongoDB 写后读_SpringBootTest

spring boot MongoDB 写后读_SpringBootTest1. Linux下启动MongoDB并使用mongosh连接 启动方式有两种: systemctl start mongod mongod <选项参数> 启动的时候有可能会报类似如下的错误

Spring Boot MongoDB

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

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

chown -R mongodb:mongodb /var/lib/mongodb
chown -R mongodb:mongodb /var/log/mongodb/
chown -R mongodb:mongodb /var/run/mongodb/
chown mongodb:mongodb /tmp/mongodb-27017.sock

spring boot MongoDB 写后读_SpringBootTest

spring boot MongoDB 写后读_SpringBootTest

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

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

spring boot MongoDB 写后读_SpringBootTest

spring boot MongoDB 写后读_SpringBootTest

spring boot MongoDB 写后读_SpringBootTest

spring boot MongoDB 写后读_SpringBootTest

备忘录

ls -l /var/run/mongodb/
ls -l /var/log/mongodb/
ls -l /var/lib/mongo/
ls -l /tmp/*.sock

id

rm -rf /tmp/mongodb-27017.sock

systemctl start mongod

mongosh

test> use admin
admin> db.createUser(
      {
          user: "myUserAdmin",
          pwd: passwordPrompt(),
          roles: [
              { role: "userAdminAnyDatabase", db: "admin" },
              { role: "readWriteAnyDatabase", db: "admin" }
          ]
        }
    )


sudo vim /etc/mongod.conf
sudo systemctl restart mongod

mongosh --port 27017  --authenticationDatabase "admin"  -u "myUserAdmin" -p

test> use book
switched to db book
book> db.chinese.insertOne({title:"语文"})

test> use admin
switched to db admin
admin> db.auth("myUserAdmin","123456")
{ ok: 1 }
admin> use book
switched to db book
book> db.createUser({user:"zhangsan",pwd:"123456",roles:[{role:"readWrite",db:"book"}]})
{ ok: 1 }
book> db.auth("zhangsan","123456")
{ ok: 1 }
book> show collections

2.  Docker 运行 MongoDB

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

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


docker run -it --rm --network my-network mongo 
    mongosh --host my-mongo 
        -u mongoroot 
        -p 123456 
        --authenticationDatabase admin 

spring boot MongoDB 写后读_SpringBootTest

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

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


docker exec -it my-mongo mongosh

spring boot MongoDB 写后读_SpringBootTest

备忘录

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

docker run -it --rm --network my-network mongo 
    mongosh --host my-mongo 
        -u mongoroot 
        -p 123456 
        --authenticationDatabase admin 


docker exec -it my-mongo mongosh 

docker run -it --rm mongo mongosh --help
docker exec -it some-mongo bash
docker logs -f some-mongo

docker exec -it my-mongo mongosh 
use admin
db.auth("myUserAdmin","123456")
db.createUser({user:"hello",pwd:"world",roles:[{role:"readWrite",db:"movie"}]})

spring boot MongoDB 写后读_SpringBootTest

补充

不建议用root用户来运行MongoDB

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

spring boot MongoDB 写后读_SpringBootTest

3.  Spring Boot 集成 MongoDB

maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

完整的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.6.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.cjs.example</groupId>
    <artifactId>demo-mongodb</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo-mongodb</name>

    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</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>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

application.yml

spring:
  data:
    mongodb:
      host: 192.168.28.32
      port: 27017
      database: movie
      username: hello
      password: world
#      uri: mongodb://192.168.28.32:27017

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

方式一:MongoTemplate

首先,定义一个实体类

package com.cjs.example.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

import java.io.Serializable;
import java.util.List;

/**
 * @Author ChengJianSheng
 * @Date 2022/1/12
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "film")
public class Film implements Serializable {

    @Id
    private String id;

    private String name;

    private List<String> category;
}

然后,利用MongoTemplate进行操作

package com.cjs.example;

import com.cjs.example.domain.Film;
import com.cjs.example.repository.FilmRepository;
import org.junit.jupiter.api.Test;
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 javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;

@SpringBootTest
class DemoMongodbApplicationTests {

    @Resource
    private MongoTemplate mongoTemplate;


    /**
     * movie> db.createUser({user:"hello",pwd:"world",roles:["readWrite"]})
     */
    @Test
    void contextLoads() {
        Film film = new Film();
        film.setName("我和我的父辈");
        film.setCategory(Arrays.asList("剧情"));
        mongoTemplate.insert(film);
    }

    @Test
    void testQuery() {
        List<Film> filmList = mongoTemplate.findAll(Film.class);
        System.out.println(filmList);

        Query query = new Query();
        query.addCriteria(Criteria.where("name").is("我和我的父辈").and("category").in("爱情","战争","剧情"));
        Film film = mongoTemplate.findOne(query, Film.class);
        System.out.println(film);
    }

    @Test
    void testSave() {
        Film film = new Film();
        film.setId("asdfgh");
        film.setName("长津湖");
        film.setCategory(Arrays.asList("战争","历史"));
        mongoTemplate.save(film);
    }

}

方式二:Spring Data MongoDB Repositories 

spring boot MongoDB 写后读_SpringBootTest

定义一个Repository

package com.cjs.example.repository;

import com.cjs.example.domain.Film;
import org.springframework.data.repository.CrudRepository;

import java.util.List;

/**
 * @Author ChengJianSheng
 * @Date 2022/1/12
 */
public interface FilmRepository extends CrudRepository<Film, String> {
    
    List<Film> findByName(String name);
}

完整测试代码如下:

package com.cjs.example;

import com.cjs.example.domain.Film;
import com.cjs.example.repository.FilmRepository;
import org.junit.jupiter.api.Test;
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 javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;

@SpringBootTest
class DemoMongodbApplicationTests {

    @Resource
    private MongoTemplate mongoTemplate;

    @Resource
    private FilmRepository filmRepository;

    /**
     * movie> db.createUser({user:"hello",pwd:"world",roles:["readWrite"]})
     */
    @Test
    void contextLoads() {
        Film film = new Film();
        film.setName("我和我的父辈");
        film.setCategory(Arrays.asList("剧情"));
        mongoTemplate.insert(film);
    }

    @Test
    void testQuery() {
        List<Film> filmList = mongoTemplate.findAll(Film.class);
        System.out.println(filmList);

        Query query = new Query();
        query.addCriteria(Criteria.where("name").is("我和我的父辈").and("category").in("爱情","战争","剧情"));
        Film film = mongoTemplate.findOne(query, Film.class);
        System.out.println(film);
    }

    @Test
    void testSave() {
        Film film = new Film();
        film.setId("asdfgh");
        film.setName("长津湖");
        film.setCategory(Arrays.asList("战争","历史"));
        mongoTemplate.save(film);
    }

    @Test
    void testSaveByRepository() {
        filmRepository.save(new Film("1234", "火影忍者", Arrays.asList("动画","喜剧","动作","冒险")));
    }

    @Test
    void testQueryByRepository() {
        Film film = filmRepository.findById("1234").orElse(null);
        System.out.println(film);
        film = filmRepository.findByName("火影忍者").get(0);
        System.out.println(film);

        filmRepository.findAll().forEach(System.out::println);
    }
}

spring boot MongoDB 写后读_SpringBootTest

工程结构如下:

spring boot MongoDB 写后读_SpringBootTest

spring boot MongoDB 写后读_SpringBootTest

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5552.html

(0)
上一篇 2023-05-04
下一篇 2023-05-04

相关推荐

  • Python实现SOCKS5代理服务器

    Python实现SOCKS5代理服务器在今天的互联网世界中,网络安全问题比以往任何时候都更受人们关注。在此背景下,代理服务器成为网民保护隐私和信息安全的重要工具之一。代理服务器即在客户端和目标服务器之间充当中间人的角色,使得客户端能够间接地访问目标服务器,从而实现隐藏真实IP地址,以及加密等功能的实现。在这种情况下,我们需要一个高效的、安全的、可靠的代理服务器来满足用户的需求。Python是一种高效的编程语言,在网络通信领域也有很好的应用。在这篇文章中,我们将学习如何使用Python来实现一个SOCKS5代理服务器。

    2024-08-25
    16
  • mysql 分区表,为什么分区键必须是主键的一部分组成_oracle分区表本地索引和全局索引

    mysql 分区表,为什么分区键必须是主键的一部分组成_oracle分区表本地索引和全局索引随着业务的不断发展,数据库中的数据会越来越多,相应地,单表的数据量也会越到越大,大到一个临界值,单表的查询性能就会下降。 这个临界值,并不能一概而论,它与硬件能力、具体业务有关。 虽然在很多 MySQ

    2023-05-02
    201
  • 使用Python和MongoDB创建数据库表

    使用Python和MongoDB创建数据库表MongoDB是当前最受欢迎的NoSQL数据库之一。Python是一种功能强大的编程语言,因其易学易用而受到广泛欢迎。在本文中,我们将讨论如何使用Python和MongoDB创建数据库表。

    2024-08-19
    19
  • MySQL5.7-utf8mb4保存emoji表情失败踩坑[亲测有效]

    MySQL5.7-utf8mb4保存emoji表情失败踩坑[亲测有效]Emoji表情很有趣,但是直接存到数据库里面会报错,因为现在Emoji都是4字节,8字节的字符,不同以往utf8 比如SQLException :Incorrect string value: ‘x…

    2023-02-07
    138
  • Python元组:简洁高效的数据结构

    Python元组:简洁高效的数据结构Python中元组是一种有序列表,与列表相似,不同的是元组中的元素不能修改,且使用圆括号()来创建。元组的优势在于其不可更改性,因此在创建只读的数据结构时非常有用。下面是创建元组的实例:

    2024-02-29
    86
  • 如何在Python中创建虚拟环境

    如何在Python中创建虚拟环境虚拟环境是Python专门用来隔离项目之间环境的工具。在一个虚拟环境中,你可以独立安装需要的包,而不会影响到其他项目的环境。这可以方便你在同一台电脑上同时开发多个Python项目,同时也可以简化项目的依赖管理。

    2024-06-22
    43
  • 日志系统(2)_日志文件系统

    日志系统(2)_日志文件系统:重做日志。每当有操作时,在数据变更之前将操作写入 ,这样当发生掉电之类的情况时系统可以在重启后继续操作 :称为撤销日志,当一些变更执行到一半无法完成时,可以根据撤销日志恢复到变更之间的状态。 位于存

    2023-02-11
    177
  • Python起始参数:完整指南

    Python起始参数:完整指南Python脚本通常可以在运行时动态地获取参数。命令行参数是由程序在运行时传递的字段,以决定程序的运行方式。Python的sys模块提供了一个名为sys.argv的列表,其中包含了传递到Python脚本的所有参数。其中,sys.argv[0]表示脚本名称,sys.argv[1]表示第一个参数,以此类推。下面是一个示例:

    2024-03-27
    61

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注