Spring boot 与 MongoDB 之连线

MongoDB 是一个 NoSQL 实现。NoSQL 在具有高吞吐量的应用程序中可以非常高性能。

  • 没有架构和关系
  • 和 SQL 都有 Database
  • NoSQL 表配称为集合(collections)
  • 集合中没有 records,而是文档(Document),像 javascript 的 Object
  • 可以在同一个集合中存储具有不同结构的多个文档
  • 可以存储通常相同但某些字段可能不同的文档

如果数据发生变化,我们必须在多个地方更新它。我们检索数据,不必 Join(Mysql join)多个表,虽然现在的 API 可以使用 Join 但应该尽量避免。

简单的使用 docker-compose 建立环境

version: '3.7'
services:
    mongo:
        image: mongo:4
        restart: always
        environment:
            MONGO_INITDB_ROOT_USERNAME: root
            MONGO_INITDB_ROOT_PASSWORD: '00000000'
        ports:
            - 27017:27017
        volumes:
            - data-volume:/data/db
            - config-volume:/data/configdb

    mongo-express:
        image: mongo-express
        restart: always
        ports:
            - 8081:8081
        environment:
            ME_CONFIG_MONGODB_ADMINUSERNAME: root
            ME_CONFIG_MONGODB_ADMINPASSWORD: '00000000'
            ME_CONFIG_MONGODB_URL: mongodb://root:00000000@mongo:27017/
volumes:
    data-volume:
    config-volume:

在 Spring boot 的 pom.xml 加入以下

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

配置 Spring boot 连线 MongoDB 的资讯

@Slf4j
@Configuration
public class MongoConfig extends AbstractMongoClientConfiguration {

    @Value("${mongo_db}")
    private String database;

    @Value("${mongo_hosts}")
    private String hosts;

    @Value("${mongo_ports}")
    private String ports;

    @Value("${mongo_user_name}")
    private String user;

    @Value("${mongo_password}")
    private String password;

    @Override
    protected String getDatabaseName() {
        // TODO Auto-generated method stub
        return database;
    }

    @Override
    public MongoClient mongoClient() {
        // TODO Auto-generated method stub
        // 如果有配置使用者以及帐号密码
        MongoCredential credential = MongoCredential.createScramSha256Credential(user, database, password.toCharArray());
        // createScramSha256Credential(user, database, password.toCharArray());

        List<ServerAddress> serverAddresses = new ArrayList<>();
        List<String> hostList = Arrays.asList(hosts.split(","));
        List<String> portList = Arrays.asList(ports.split(","));
        for (String host : hostList) {
            Integer index = hostList.indexOf(host);
            Integer port = Integer.parseInt(portList.get(index));

            ServerAddress serverAddress = new ServerAddress(host, port);
            serverAddresses.add(serverAddress);
        }

        MongoClient mongoClients = MongoClients.create(
            MongoClientSettings.builder()
            .applyToClusterSettings(builder -> builder.hosts(serverAddresses))
            .credential(credential)
            .build());

        log.info("Mongodb Server Addresses: {}", serverAddresses.toString());
        log.info("Mongo Client: {}", mongoClients.getDatabase(database));

        /**
         * 从 database 获取 gnss collection
         */
        // MongoDatabase database = mongoClients.getDatabase(getDatabaseName());
        // MongoCollection<Document> coll = database.getCollection("gnss");
        // coll.find().forEach(d -> System.out.println(d.toJson()));

        return mongoClients;

    }

    @Override
    protected Collection<String> getMappingBasePackages() {
        // TODO Auto-generated method stub
        return Collections.singleton("com.example.cch.mongo");
    }
    
    @Bean
    public MongoTemplate mongoTemplate() {
        return new MongoTemplate(mongoClient(), getDatabaseName());
    }
}

在 application.properties 配置环境变数

mongo_db=aiot
mongo_hosts=172.17.8.222
# 
mongo_ports=27017
# 
mongo_user_name=root
mongo_password=00000000
# spring.data.mongodb.auto-index-creation=true

将以下注解打开即可测试 Spring boot 是否能对 MongoDB 进行交互

        MongoDatabase database = mongoClients.getDatabase(getDatabaseName());
        MongoCollection<Document> coll = database.getCollection("gnss");
        coll.find().forEach(d -> System.out.println(d.toJson()));

mongo-express 是一个可以操作 MongoDB 的 WebGUI 介面不论是创建 index 或是 collection 都相当方便~


<<:  Day12 React -Events

>>:  第一次接触 Laravel

Day 16 - 函数与物件互动3

接下来我们就可以制作一个myflower的object 去制作一个绽放花点的设定 Learp 使用 ...

30天学习笔记-day 23- Dagger (上篇)

昨天稍微讲解了Dependency Injection,今天要来介绍dagger了。 Dagger ...

【Day 3】BERT的输出与它们的意义

BERT输出了什麽? 回应上一篇关於词嵌入Token Embedding的讨论,BERT的输出就是文...

Day 07 - Spring Boot 常用依赖

正如Day 04 - Spring Boot 的前世今生所说,Spring Boot 为了简化设定提...

JavaScript回圈

回圈就是一种重复结构的逻辑,它就是我们日常生活中所说的:「如果…就继续…」的情况。当条件运算式成立时...