使用mongoimport批量导入CSV到MongoDB时遇参数解析错误求助
MongoDB批量导入CSV文件参数解析错误解决方法
我需要将CSV文件导入MongoDB,使用mongoimport命令。已经在Windows系统安装了Database Tools,把C:\Program Files\MongoDB\Tools\100\bin添加到环境变量PATH并重启电脑。编写了bash脚本批量导入脚本目录下的所有CSV文件,但执行脚本时出现参数解析错误,提示需提供单个文件名和单个MongoDB连接字符串(需以mongodb://或mongodb+srv://开头)。
原脚本内容
#!/bin/bash HOST="00.00.000.00:00000" USERNAME="user" PASSWORD="password" DB_NAME="mydb" CSV_EXTENSION=".csv" # Get the directory path of the script SCRIPT_DIRECTORY=$(pwd) for fullFilePath in "$SCRIPT_DIRECTORY"/* do filename="${fullFilePath##*/}" fileNameWithoutExtension="${filename%.[^.]*}" fileExtension="${filename:${#fileNameWithoutExtension}}" fileExtensionLowerCase=${fileExtension,,} if [ "$fileExtensionLowerCase" == "$CSV_EXTENSION" ]; then echo "importing collection: $fileNameWithoutExtension ..." mongoimport --db=$DB_NAME --collection=$fileNameWithoutExtension --type csv --headerline --file=$fullFilePath --host=$HOST -u=$USERNAME -p=$PASSWORD --authenticationDatabase=admin fi done
执行错误输出
$ ./Import_File_On_Mongo.sh importing collection: Test ... 2023-10-06T17:49:03.612+0200 error parsing command line options: error parsing positional arguments: provide only one file name and only one MongoDB connection string. Connection strings must begin with mongodb:// or mongodb+srv:// schemes
解决方法
这个错误源于新版MongoDB Database Tools对参数解析的逻辑变化,分散的连接参数(--host、-u、-p等)容易和连接字符串的解析规则冲突。改用**连接字符串(--uri参数)**统一传递连接信息即可解决,同时优化脚本逻辑:
修改后的脚本
#!/bin/bash USERNAME="user" PASSWORD="password" HOST="00.00.000.00:00000" DB_NAME="mydb" # 构造标准MongoDB连接字符串 CONN_STR="mongodb://$USERNAME:$PASSWORD@$HOST/?authSource=admin" # 准确获取脚本所在目录(不受执行目录影响) SCRIPT_DIRECTORY=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # 直接遍历目录下所有CSV文件 for fullFilePath in "$SCRIPT_DIRECTORY"/*.csv do # 跳过不存在的文件(避免目录无CSV时遍历到"*.csv"字符串) [ -e "$fullFilePath" ] || continue # 提取文件名(不含扩展名)作为集合名 fileNameWithoutExtension="${fullFilePath##*/}" fileNameWithoutExtension="${fileNameWithoutExtension%.csv}" echo "导入集合: $fileNameWithoutExtension ..." # 使用--uri传递连接信息,给文件路径加双引号兼容空格 mongoimport --db=$DB_NAME \ --collection=$fileNameWithoutExtension \ --type csv \ --headerline \ --file="$fullFilePath" \ --uri="$CONN_STR" done
关键修改点
- 用
--uri参数传递完整连接字符串,替代分散的--host、-u、-p、--authenticationDatabase,避免参数解析冲突 - 直接遍历
*.csv文件,简化扩展名判断逻辑,同时添加判断跳过不存在的文件,防止目录无CSV时出错 - 改用
$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)获取脚本实际所在目录,替代原$(pwd)(原方法取的是执行脚本时的当前目录,不是脚本存放目录) - 给
--file参数的值加双引号,兼容文件路径包含空格的场景
内容的提问来源于stack exchange,提问作者Paul Marcelin Bejan
相关产品推荐
相关产品推荐

