在 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 中使用 JavaScript、jQuery 的 Ajax 成功时将数字转化为星级?