mongoimport导入CSV时如何将所有字段统一设置为字符串类型
mongoimport 导入CSV统一所有字段为字符串方案
mongoimport 没有提供全局一键将所有字段设为字符串的内置参数,无需手动逐字段指定类型,通过脚本动态生成类型规则即可实现需求,可直接适配你现有的PowerShell批量导入流程。
实现逻辑
--columnsHaveTypes参数支持显式定义字段类型,规则为在字段名后拼接类型后缀,比如字段age指定为字符串写为age.string()。
要让所有字段统一为字符串,不需要逐个手写规则,在脚本中自动读取每个CSV的表头,给所有字段批量拼接.string()后缀,再作为参数传给mongoimport即可,可自动适配不同字段结构的CSV文件。
可用脚本
常规CSV版本
适合字段内容不含引号包裹逗号的普通CSV,执行效率更高:
cd <path to directory of csv files> $files = Get-ChildItem . foreach ($f in $files) { if ($f -Like "*.csv") { $headerLine = Get-Content $f.FullName -First 1 $fieldsWithType = ($headerLine -split ',') | ForEach-Object { "$($_.Trim()).string()" } $fieldsArg = $fieldsWithType -join ',' mongoimport -d mydb -c mycollection --type csv --file $f.FullName --columnsHaveTypes --fields $fieldsArg --skip 1 } }
复杂格式CSV版本
如果CSV存在字段内包含逗号、被双引号包裹的情况,用PowerShell原生CSV解析器读取表头,避免列拆分错误:
cd <path to directory of csv files> $files = Get-ChildItem . foreach ($f in $files) { if ($f -Like "*.csv") { $csvSample = Import-Csv $f.FullName | Select-Object -First 1 $fieldsWithType = $csvSample.psobject.properties.name | ForEach-Object { "$_.string()" } $fieldsArg = $fieldsWithType -join ',' mongoimport -d mydb -c mycollection --type csv --file $f.FullName --columnsHaveTypes --fields $fieldsArg --skip 1 } }
说明
- 脚本会自动识别每个CSV的表头生成规则,不需要针对单个文件手动配置字段
- 命令中添加
--skip 1是因为已经手动读取了第一行表头作为字段定义,跳过第一行避免把表头导入为数据行 - 支持
--columnsHaveTypes参数的mongoimport版本(MongoDB 3.4及以上)均可正常使用 - 导入过程会跳过自动类型推断,数字、日期类内容不会被转为对应BSON类型,全部以字符串格式存储
内容的提问来源于stack exchange,提问作者sridharnetha
相关产品推荐
相关产品推荐

