中间件--MongoDB部署及初始化js脚本(docker部署,docker-entrypoint-initdb.d,数据迁移,自动化部署)

一、概述

MongoDB是一种常见的Nosql数据库(非关系型数据库),以文档(Document)的形式存储数据。是非关系型数据库中最像关系型数据库的一种。本篇主要介绍下部署和数据迁移。

在 MongoDB 官方镜像部署介绍中,MongoDB 的官方镜像会在容器首次启动时自动执行 docker-entrypoint-initdb.d/ 目录下的所有.js 文件(注意:只会在容器创建的第一次会执行,如果是运行之前已有的容器则不会执行),我们可以利用这一点来实现数据的迁移和自动化部署服务。

二、完整部署和迁移过程:

1、删除之前的容器

因为js脚本仅会在初次创建容器启动时才会被执行。如果是已存在的容器重新运行,js脚本是不会被执行的。所以如果之前有运行的容器,需要删除。
命令:

docker rm -f mongdb-with-js

删除示例:
在这里插入图片描述

2、编写Dockerfile脚本

因为我们要把我们指定的js文件压到官方的mongDB镜像中,所以这里需要编写Dockerfile文件,用来重新构建镜像。

Dockerfile示例:

# 使用自定义的 MongoDB 镜像
FROM mongo:7.0.4# 维护者信息
MAINTAINER weisian# 设置时区为上海
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime# 将 object-mongo.js 文件复制到容器的初始化脚本目录
COPY ./object-mongo.js /docker-entrypoint-initdb.d

3、编写用于初始化的js脚本

该js文件会被Dockerfile文件压入到镜像中。本例的js脚本就是需要初始化到库中的数据。

名称如
object-mongo.js

代码示例:

console.log("start running js!!!");
const db = db.getSiblingDB("object_cloud");     // 指定库的名称try {console.log("Switching to database: object_cloud");console.log("Inserting data into object_sensor_category...");// 在object_cloud库的object_sensor_category表中插入数据(支持many和one两种方法)const result = db.object_sensor_category.insertMany([{"_id" : NumberLong("988405030841225243"),"sensorModel" : "DT-ZD-V1001","vibrateIndicators" : [ "rms", "peak"],"params" : {"frequencyResponse" : 22,"sensitivity" : 102},"deleteFlag" : false,"createTime" : ISODate("2024-06-20T03:28:43.030Z")},{"_id" : NumberLong("988405030841225244"),"sensorModel" : "DT-ZS-V1001","pointTypeList" : [ {"pointType" : 1020,"dataBizTypes" : [ 1020]}],"params" : {"workmanshipCollectInterval" : 60,"triggerCount" : 30},"createTime" : ISODate("2024-06-20T03:28:43.030Z"),"createUser" : "1543837863788879871"}]);const result2 = db.object_category.insertMany([{"_id" : NumberLong("988108368994373658"),"collectorChannelNum" : 18,"channelConfList" : [ {"channelType" : "1020","sensorTypeList" : [ NumberLong("988405030841225244")]}],"manufacturerId" : NumberLong("7382949823"),"workmanshipExist" : [ NumberLong(1060)],"sensorTypeList" : [ NumberLong("988404952147693592"), NumberLong("988405030841225242")],"updateTime" : ISODate("2024-06-19T07:49:53.351Z"),"updateUser" : "1543837863788879871"}]);} catch (e) {console.error("Error inserting data: " + e);
}

4、重新构建镜像

(1)、创建工作路径
随意创建一个目录即可。
上传前面编写的Dockerfile和object-mongo.js两个文件
在这里插入图片描述

(2)、重新构建镜像image-mongodb-js:1.0
命令:

docker build -t image-mongodb-js:1.0 .

在这里插入图片描述

(3)、查询镜像存在
在这里插入图片描述

5、启动mongodb服务

(1)、指定用户名(root),密码(123456),和镜像
命令:

docker run -d --name mongodb-with-js -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 image-mongodb-js:1.0

在这里插入图片描述

(2)、查看启动日志
命令:

docker logs mongodb-with-js

可以看到object-mongo.js中打印的日志信息,方便查看是否初始化js等操作信息。
在这里插入图片描述

6、客户端连接验证

使用如下的IP、端口,用户名,密码连接mongDb服务。
ip:27017
root/123456
可以看到登录成功,且数据初始化完成。
在这里插入图片描述

7、过程中的几个命令记一下

进入容器
docker exec -it 415dc88956bd bash
停止并删除容器
docker rm -f mongodb-with-js
删除镜像
docker rmi image-mongodb-js:1.0
宿主机打开mongo shell窗口(可执行原始的mongo命令,在mongDB5.0及之后改为mongosh)(如果进入容器内直接*mongosh即可打开)
docker exec -it mongodb-with-js mongosh以下几个为mong shell的脚本:展示mongo服务中有哪些个数据库
show databases
切换数据库
use phm_local
展示当前数据库下的表
show collections
展示当前数据库下,指定表中的数据
db.object_sensor_category.find().pretty();
加载执行js脚本
load("/docker-entrypoint-initdb.d/phm-mongo.js")

三、js脚本需要注意的点

(1)、Long类型的精度问题

在处理long类型时,如果不用双引号框起来会造成精度丢失问题甚至报错。如下为正确和错误的示例。
正确示例:

"_id" : NumberLong("988404952147693592"),错误示例如:
"_id" : NumberLong(988404952147693592),

(2)、注意mongDb的版本

使用5.0之前和之后的mongDb版本,js语法可能会不相同。
目前使用7.0.4版本,可用语法如下:

const db = db.getSiblingDB("object_cloud");   // 切换到object_cloud库
const result = db.object_sensor_category.insertMany([])   // db库导入多条数据

(3)、时间对象

时间对象需要改成以下格式,注意后面也有双引号

"createTime" : ISODate("2024-06-20T03:28:24.269Z")

四、通过代码做数据迁移

通过如下的代码,也可以实现mongoDb数据的迁移工作。但这种方式要求必须同时连接到两个数据源,对于一些线上环境往往是平常无法访问的。如果网络环境不通的情况下,就只能先把数据导出后,在迁移到目标环境中进行导入的工作(上面的js初始化方式也是这种实现的逻辑,但是不同在于js的方式实现了自动化部署,即:不需要人为再去操作迁移了)

java代码示例如下:


import com.alibaba.fastjson2.JSON;
import com.mongodb.MongoClientSettings;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.*;
import org.bson.Document;
import java.util.Collections;
import java.util.Iterator;public class MongoMigration {public static void main(String[] args) {String[] collections = new String[]{    // 指定需要迁移数据的表"object_category",
//                "object_running_conf","object_sensor_category"};for (String collection:collections){copyCollection(collection);       // 遍历上面的表进行数据迁移}}private static void copyCollection(String collection) {// 源MongoDB配置String sourceHost = "";int sourcePort = 27017;String sourceDatabase = "object-cloud";String sourceUsername = "root"; // 如果需要的话String sourcePassword = "123456"; // 如果需要的话// 目标MongoDB配置String targetHost = "";int targetPort = 38630; String targetDatabase = "object-cloud";String targetUsername = "root"; // 如果需要的话String targetPassword = "123456"; // 如果需要的话// 连接到源MongoDBMongoClient sourceClient = createMongoClient(sourceHost, sourcePort, sourceDatabase, sourceUsername, sourcePassword);MongoDatabase sourceDatabaseInstance = sourceClient.getDatabase(sourceDatabase);MongoCollection<Document> sourceCollectionInstance = sourceDatabaseInstance.getCollection(collection);// 连接到目标MongoDBMongoClient targetClient = createMongoClient(targetHost, targetPort,  targetDatabase ,targetUsername, targetPassword);MongoDatabase targetDatabaseInstance = targetClient.getDatabase(targetDatabase);MongoCollection<Document> targetCollectionInstance = targetDatabaseInstance.getCollection(collection);// 从源集合读取数据并写入目标集合FindIterable<Document> documents = sourceCollectionInstance.find();Iterator<Document> iterator = sourceCollectionInstance.find().iterator();int i=0;while (iterator.hasNext()) {Document doc = iterator.next();targetCollectionInstance.insertOne(doc);if (++i>100){                  // 仅迁移前100条数据,有些表数据量太大,不需要可以放弃。如果需要全量,这里要删除掉break;}}// 关闭连接sourceClient.close();targetClient.close();System.out.println("Data migration completed successfully!");}private static MongoClient createMongoClient(String host, int port, String  database, String username, String password) {MongoCredential credential = null;if (username != null && !username.isEmpty() && password != null && !password.isEmpty()) {credential = MongoCredential.createCredential(username, database, password.toCharArray()); }MongoClientSettings settings = MongoClientSettings.builder().applyToClusterSettings(builder ->builder.hosts(Collections.singletonList(new ServerAddress(host, port)))).credential(credential) // 如果需要认证.build();return MongoClients.create(settings);}
}

五、总结

通过MongDB官方镜像的特性,会在容器首次启动时自动执行 docker-entrypoint-initdb.d/ 目录下的所有.js 文件,可以利用这一点来实现mongDB的数据迁移或自动化部署服务。

学海无涯苦作舟!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/489618.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VScode、Windsurf、Cursor 中 R 语言相关快捷键设置

前言 在生物信息学数据分析中&#xff0c;R语言是一个不可或缺的工具。为了提高R语言编程效率&#xff0c;合理设置快捷键显得尤为重要。本文介绍在VSCode Windsurf Cursor 中一些实用的R语言快捷键设置&#xff0c;让非 Rstudio 的 IDE 用起来得心应手&#x1f611; 操作种…

R学习——因子

目录 1 定义因子&#xff08;factor函数&#xff09; 2因子的作用 一个数据集中的 只需要考虑可以用哪个数据来进行分类就可以了&#xff0c;可以用来分类就可以作为因子。 Cy1这个因子对应的水平level是4 6 8&#xff1a; 1 定义因子&#xff08;factor函数&#xff09; 要…

GoTrackIt应用指南:共享单车时空轨迹优化

本篇文章我们来基于GoTrackIt 包来研究一下里面的轨迹数据清洗功能&#xff0c;该包这部分功能是一个用于处理和分析GPS轨迹数据的工具&#xff0c;能够帮助用户进行诸如卡尔曼滤波平滑、轨迹简化&#xff1b;停留点删除、增密、降频、滑动窗口平滑的链式操作&#xff0c;并提供…

雨晨 24H2 IoT 企业版 ltsc 2024 Hotpatch 极简 26100.2605

文件: 雨晨 24H2 IoT 企业版 ltsc 2024 Hotpatch 极简 26100.2605 install.esd 大小: 1970652896 字节 修改时间: 2024年12月13日, 星期五, 18:06:39 MD5: 3DCB989B62B6656B2CB34B0D88EBEE45 SHA1: C6E890223892B7A3EDA59E4881C70214DD546DB7 CRC32: 13EDFA89 与往版&#xff…

实现 RAM 时应该考虑的性能因素

实现 RAM 时应该考虑的性能因素 要高效地推断存储元件&#xff0c;需要考虑下列影响性能的因素&#xff1a; • 使用专用块还是分布式 RAM RAM 可以在专用块 RAM 或使用分布式 RAM 的 LUT 内实现。不同的选择会影响资源选择&#xff0c;同时还会严重地影响性 能和功耗…

python数据分析之爬虫基础:解析

目录 1、xpath 1.1、xpath的安装以及lxml的安装 1.2、xpath的基本使用 1.3、xpath基本语法 2、JsonPath 2.1、jsonpath的安装 2.2、jsonpath的使用 2.3、jsonpath的基础语法 3、BeautifulSoup 3.1、bs4安装及创建 3.2、beautifulsoup的使用 3.3、beautifulsoup基本语…

pytest入门三:setup、teardown

https://zhuanlan.zhihu.com/p/623447031 function对应类外的函数&#xff0c;每个函数调用一次 import pytest def setup_module():print(开始 module)def teardown_module():print(结束 module)def setup_function():print(开始 function)def teardown_function():print(结…

Tomcat的安装即使用

Tomcat的概念 Tomcat服务器是Java语言开发的&#xff0c;免费的开放源代码的Web应用服务器。 Tomcat处理静态HTML的能力远不及Apache或者Nginx&#xff0c;通常是作为一个Servlet和JSP容器&#xff0c;单独运行在后端。 Tomcat是由三个功能组合而成&#xff1a; java servlet&…

信创改造-Spring Boot 项目部署至 TongWeb

打 war 包参考&#xff1a;https://blog.csdn.net/z1353095373/article/details/144330999

ubuntu20.04+ROS Noetic 安装PX4+Mavros

文章目录 系统环境安装依赖PX4 安装老版本安装测试环境变量添加版本查看 安装MAVROS&#xff08;二进制安装非源码安装&#xff09;测试 OGC 地面站安装测试mavros与sitl通信参考 系统环境 ubuntu 20.04 ROS Noetic 如果系统安装了Anaconda等虚拟环境管理器&#xff0c;要退出…

day10 电商系统后台API——接口测试(使用postman)

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 实战项目简介&#xff1a; 1、用户管理&#xff08;8个&#xff09; 1.1 登录 1.2 获取用户数据列表 1.3 创建用户 1.4 修改用户状态 1.5 根据id查询用户 1.6 修改用户信息 1.7 删除单个用户 1.8 …

C语言程序设计P5-5【应用函数进行程序设计 | 第五节】—知识要点:变量的作用域和生存期

知识要点&#xff1a;变量的作用域和生存期 视频&#xff1a; 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 有一个一维数组&#xff0c;内放 10 个学生成绩&#xff0c;写一个函数&#xff0c;求出平均分、最高分和最低分。 任务要求用一个函数来完…

CentOS安装Nginx提示没找到

说明&#xff1a;在CentOS操作系统里&#xff0c;用yum方式安装Nginx&#xff0c;提示下面的错误&#xff1b; 说没找到&#xff0c;敲下面的命令&#xff0c;看下包管理器里面有没有Nginx&#xff1b; yum list available nginx如下&#xff0c;确实没有找到&#xff1b; 敲下…

Edge SCDN深度解析,边缘安全加速的创新实践

边缘安全加速&#xff08;Edge Secure Content Delivery Network&#xff0c;SCDN&#xff09;是酷盾安全推出的边缘集分布式 DDoS 防护、CC 防护、WAF 防护、BOT 行为分析为一体的安全加速解决方案。通过边缘缓存技术&#xff0c;智能调度使用户就近获取所需内容&#xff0c;为…

HTML、CSS表格的斜表头样式设置title 画对角线

我里面有用到layui框架的影响&#xff0c;实际根据你自己的框架来小调下就可以 效果如下 上代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…

java 导出word锁定且部分内容解锁可编辑

使用 Apache POI 创建带编辑限制的 Word 文档 在日常工作中&#xff0c;我们可能需要生成一些带有编辑限制的 Word 文档&#xff0c;例如某些段落只能被查看&#xff0c;而其他段落可以自由编辑。本文介绍如何使用 Apache POI 创建这样的文档&#xff0c;并通过代码实现相应的…

【多模态文档智能】OCR-free感知多模态大模型技术链路及训练数据细节

目前的一些多模态大模型的工作倾向于使用MLLM进行推理任务&#xff0c;然而&#xff0c;纯OCR任务偏向于模型的感知能力&#xff0c;对于文档场景&#xff0c;由于文字密度较高&#xff0c;现有方法往往通过增加图像token的数量来提升性能。这种策略在增加新的语言时&#xff0…

docker快速实现ELK的安装和使用

目录 一、ELK功能原理 二、项目功能展示​ 三、日志查询展示​ 四、ELK安装步骤 1、创建elasticsearch、kibana、filebeat相关data、log、conf目录 2、进入/usr/local/elk目录&#xff0c;并创建一个docker网络 3、启动 elasticsearch容器 4、运行kibana容器 5、启动f…

windows下Qt5自动编译配置QtMqtt环境

原文链接&#xff1a;windows下Qt5自动编译配置QtMqtt环境&#xff08;11&#xff09;-CSDN博客 1、概述 Qt默认是不包含mqtt库的&#xff0c;如果需要使用到mqtt库就只能自己编译配置&#xff1b;网络所有的QtMqtt配置的文章都是编译完成手动复制&#xff0c;非常麻烦&#x…

动态高优先权优先进程调度

一、实验目的 目的&#xff1a;了解并掌握动态高优先权优先调度算法的理论&#xff0c;掌握动态优先权的设置方式。 任务&#xff1a;模拟实现动态高优先权优先的调度&#xff08;若数值越大优先权越高&#xff0c;每运行一个时间单位优先权-n&#xff0c;若数值越小优先权越高…