在 Spring Boot 应用程序初始化时将数据插入 MongoDB 容器

Posted

技术标签:

【中文标题】在 Spring Boot 应用程序初始化时将数据插入 MongoDB 容器【英文标题】:Insert Data Into MongoDB Container at the Spring Boot Application initialization 【发布时间】:2021-08-15 08:02:09 【问题描述】:

当应用程序开始运行时,我必须在 MongoDB 中的 Collection 中插入一些示例数据。我已经完成了以下步骤,但没有成功。

    在 init_script 文件夹下创建了entrypoint.js

entrypoint.js

 use admin;

db.createUser(
    
        user: "patient_db",
        pwd: "14292",
        roles: [  role: "readWrite", db: "patient_db"  ]
    
);

db.grantRolesToUser( "patient_db", [ role: "readWrite", db: "patient_db"]); 
    在资源路径中创建了data.js 文件

src/main/resources/data.js

use patient_db;

db.createCollection("holiday");

db.holiday.insert(holiday_date:'25-12-2021',holiday_name:'Christmas',created_by:'John Wick',modified_by:'John_Wick',created_date_time:'2021-04-25 04:23:55',modified_date_time:'2021-04-25 04:23:55');
    配置了 docker-compose.yml

docker-compose.yml

 version: "3"

services:
  patient-service:
    image: patient-service:1.0
    container_name: patient-service
    ports:
    - 9090:9090
    restart: on-failure
    networks:
      - patient-mongo
    depends_on:
      - mongo-db
    links:
      - mysql-db
  mongo-db:
    image: mongo:latest
    container_name: mongo-db
    ports:
      - 27017:27017
    networks:
      - patient-mongo
    volumes:
     - 'mongodata:/data/db'
     - './init_scripts:/docker-entrypoint-initdb.d' 
    environment:
     - MONGO_INITDB_ROOT_USERNAME=admin
     - MONGO_INITDB_ROOT_PASSWORD=14292
    restart: unless-stopped
    

networks:
  patient-mongo:
  
volumes:
  mongodata:

4.最后,连接MongoDB

properties-dev.yml

spring:
    data:
      mongodb:
        host: mongo-db
        port: 27017
        database: patient_db

【问题讨论】:

这能回答你的问题吗? How can you load initial data in MongoDB through Spring Boot? 我在问 MongoDB 容器。在关于本地机器上托管的本地 MongoDB 的问题中 如果数据库运行在容器中,或者在同一个系统上,或者在云中,应该没有什么不同;虽然@RandyCasburn 提到的问题没有很多细节,但我希望那里的整体技术也可以在基于 Docker 的设置中工作。 【参考方案1】:

这就是我将入口点代码插入 mongodb 容器的方式:

    创建一个 .sh 文件(example.sh) 创建 mongo 用户和要插入的数据。

example.sh

#!/usr/bin/env bash
echo "Creating mongo users..."
mongo admin --host localhost -u root -p mypass --eval "

db = db.getSiblingDB('patient_db');
db.createUser(
 
    user: "patient_db",
    pwd: "14292",
    roles: [  role: "readWrite", db: "patient_db"  ]
 
);
 db.createCollection('holiday');

db.holiday.insert(holiday_date:'25-12-2021',holiday_name:'Christmas',
created_by:'John Wick',modified_by:'John_Wick',created_date_time:'2021-04-25 04:23:55',modified_date_time:'2021-04-25 04:23:55');

"

echo "Mongo users and data created."

    在 docker-compose 中,插入入口点

    volumes:
    - 'mongodata:/data/db'
    - './example.sh:/docker-entrypoint-initdb.d/example.sh'
    

也许它不是更干净的选择,但它可以完美地工作。

我这样做是因为我没有让它与 js 文件一起使用。

【讨论】:

【参考方案2】:

感谢@Schwarz54 的回答。它适用于js 文件

init_scripts/mongo_init.js

var db = connect("mongodb://admin:14292@127.0.0.1:27017/admin");

db = db.getSiblingDB('patient_db'); /* 'use' statement doesn't support here to switch db */

db.createUser(
    
        user: "patient_db",
        pwd: "14292",
        roles: [  role: "readWrite", db: "patient_db"  ]
    
);


db.createCollection("holiday");

db.holiday.insert(holiday_date:'25-12-2021',holiday_name:'Christmas',created_by:'John Wick',modified_by:'John_Wick',created_date_time:'2021-04-25 04:23:55',modified_date_time:'2021-04-25 04:23:55');

docker-compose.yml

volumes:
     - 'mongodata:/data/db'
     - './init_scripts:/docker-entrypoint-initdb.d' 

【讨论】:

以上是关于在 Spring Boot 应用程序初始化时将数据插入 MongoDB 容器的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 在启动时将示例数据插入数据库

如何在 Spring Boot 中使用 JavaScript、jQuery 的 Ajax 成功时将数字转化为星级?

使用 Spring Boot 2.0 时将指标导出到文件

Spring Boot 排除属性文件并在执行时将其提供给 jar

将初始数据导入 Spring Boot 应用程序

Gradle Spring Boot 应用程序无法从 Json 文件中提取数据