You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 14:10:18