如何在MongoDB容器初始化脚本(mongosh执行)中读取文件并插入数据?
如何在mongosh脚本中读取本地文件并插入MongoDB(Docker初始化场景)
要实现Docker容器首次启动时自动读取磁盘文件并插入MongoDB,你可以用mongosh内置的原生函数替代NodeJS的fs模块,以下是纯mongosh可执行的脚本实现:
文本文件处理
如果读取的是文本文件,直接用cat()读取内容后转Base64:
// 指定文件路径 const filePath = "/path/to/somefile.txt"; // 读取文本文件内容 const fileContent = cat(filePath); // 转为Base64编码 const base64Data = btoa(fileContent); // 插入到集合中,使用BSON Binary类型存储 db.example.files.insertOne({ filename: "somefile.txt", data: BinData(0, base64Data) });
二进制文件处理
如果是图片、压缩包这类二进制文件,需要以原始模式读取:
const filePath = "/path/to/binaryfile.png"; // 以原始二进制模式读取,返回Uint8Array const rawBytes = cat("--raw", filePath); // 将二进制字节转成可编码的字符串,再转Base64 const base64Data = btoa(String.fromCharCode(...rawBytes)); db.example.files.insertOne({ filename: "binaryfile.png", data: BinData(0, base64Data) });
关键说明
cat():mongosh内置的文件读取函数,不加参数读取文本,--raw参数读取原始二进制数据btoa():mongosh内置的Base64编码函数,用于将字符串转为Base64格式BinData(subtype, base64):mongosh中创建BSON Binary类型的方法,0代表通用二进制子类型,和NodeJS的Binary.createFromBase64行为一致
Docker场景注意事项
- 将脚本命名为
init.js并放在容器的/docker-entrypoint-initdb.d/目录下,MongoDB容器首次启动时会自动执行 - 确保目标文件已通过Docker卷挂载或
COPY指令复制到容器内的指定路径 - 保证MongoDB运行用户(默认
mongodb)对目标文件有读取权限
内容的提问来源于stack exchange,提问作者Josh M.
相关产品推荐
相关产品推荐

