使用mongosh插入181KB JSON文件至Mongo集合遇参数过长错误
解决mongosh插入大JSON文件时"Arguments list too long"的问题
问题原因
你当前的脚本将整个JSON文件内容直接作为--eval的命令行参数传递,当文件大小超过系统内核的ARG_MAX限制(命令行参数总长度上限)时,就会触发该错误。调整ulimit -s修改的是栈大小,与命令行参数长度限制无关,因此无法解决问题。
可行解决方案
方案1:使用mongosh执行外部脚本文件
创建一个单独的JavaScript脚本文件,在脚本内读取JSON文件并执行插入操作,避免将大内容塞进命令行参数:
- 创建
import_data.js脚本:
const fs = require('fs'); // 读取并解析JSON文件 const jsonData = JSON.parse(fs.readFileSync('/some/path/file.json', 'utf8')); // 插入到目标集合 db.test_collection.insertOne(jsonData);
- 用mongosh执行该脚本:
/mongo/path/mongosh $databaseName \ --tlsCertificateKeyFile someAuthDetails \ --tlsCAFile someMoreAuthDetails \ --quiet \ --file import_data.js
方案2:通过管道传递执行逻辑到mongosh
将读取文件的逻辑通过管道传入mongosh,而非直接在命令行参数中传递大内容:
cat <<EOF | /mongo/path/mongosh $databaseName \ --tlsCertificateKeyFile someAuthDetails \ --tlsCAFile someMoreAuthDetails \ --quiet const fs = require('fs'); const jsonData = JSON.parse(fs.readFileSync('/some/path/file.json', 'utf8')); db.test_collection.insertOne(jsonData); EOF
方案3:使用官方导入工具mongoimport
如果只是单纯导入JSON文件,推荐使用MongoDB官方提供的mongoimport工具,它专门用于批量数据导入,完全规避命令行参数长度问题:
/mongo/path/mongoimport \ --db $databaseName \ --collection test_collection \ --file /some/path/file.json \ --tlsCertificateKeyFile someAuthDetails \ --tlsCAFile someMoreAuthDetails
内容的提问来源于stack exchange,提问作者Facundo Laxalde
相关产品推荐
相关产品推荐

