Mongodb mongoimport:导入CSV时为所有字段设置类型
我在导入带有Mongodb mongoimport:导入CSV时为所有字段设置类型,mongodb,mongoimport,Mongodb,Mongoimport,我在导入带有mongoimport的CSV时遇到多个问题,该CSV具有标题行 情况如下: 我有一个很大的CSV文件,第一行有字段名。 我知道您可以将此行设置为用作字段名,并使用:--headerline 我希望所有字段类型都是字符串,但是mongoimport会自动将类型设置为它的样子 像0001这样的ID将变成1,这可能会产生不良副作用 不幸的是,(据我所知)没有办法用单个命令将它们设置为字符串,而是命名每个字段并使用 --columnsHaveTypes --fields "name.str
mongoimport
的CSV时遇到多个问题,该CSV具有标题行
情况如下:
我有一个很大的CSV文件,第一行有字段名。
我知道您可以将此行设置为用作字段名,并使用:--headerline
我希望所有字段类型都是字符串,但是mongoimport
会自动将类型设置为它的样子
像0001
这样的ID将变成1
,这可能会产生不良副作用
不幸的是,(据我所知)没有办法用单个命令将它们设置为字符串,而是命名每个字段并使用
--columnsHaveTypes --fields "name.string(), ... "
当我这样做的时候,下一个问题出现了。
标题行(具有所有字段名)作为值导入到单独的文档中
基本上,我的问题是:
- 是否有办法使用
命令将所有字段类型设置为字符串--headerline
- 或者,是否有方法忽略第一行
name.string(), ...
以及mongoimport参数
--columnsHaveTypes --headerline --file <filename.csv>
我找到了一个我很满意的解决办法 基本上,我想在Clojure代码中使用mongoimport在DB中导入一个CSV文件,并用它自动完成许多工作。由于上述问题,我不得不找到一个解决办法,删除这个错误的文档 为了“解决”这个问题,我做了以下工作: 为了设置我想要的类型,我编写了一个函数来读取第一行,将其放入一个向量中,然后使用字符串连接将这些设置为字段 转向此:
id、姓名、年龄、家乡、街道
进入这个:id.string()、name.string()、age.string()
等等
然后我使用向量中的值来识别带有
{ name : "name"
age : "age"
etc : "etc" }
然后用一个简单的remving.find()命令将其删除
希望这有助于处理类似问题。我在将4100万条CSV文件上传到mongodb时遇到了这个问题
./mongoimport -d testdb -c testcollection --type csv --columnsHaveTypes -f
"RECEIVEDDATE.date(2006-01-02 15:04:05)" --file location/test.csv
如上所述,我们有一个上传数据类型为'-f'或'--fields'的文件的命令,但当我们对包含标题行的文件使用此命令时,mondodb上传第一行,即标题行,则其前导错误“无法转换为数据类型”或上传列名也作为数据集。
不幸的是,我们不能使用'--headerline'命令而不是'--fields'。
这里是我为这个问题找到的解决方案
1) 删除标题列并使用“--fields”命令上载,如上命令所示。如果您重新使用linux环境,您可以使用下面的命令删除大型文件的第一行,即头行。我花了2-3分钟。(取决于机器性能)
2) 使用“--headerline”命令上载文件,然后mongodb使用其默认标识的数据类型上载文件。然后使用testdb打开mongodb shell命令,然后运行javascript命令获取每个记录并将其更改为特定的数据类型。但如果您有大文件,这将需要时间。
如果要删除不适合数据类型的不必要行,请使用以下命令。
“--parseGrace skipRow”
不幸的是,两者都不符合我的需要。我找到了一种处理这个问题的方法(见我的答案),但现在我更加确信,添加标准类型是不受支持的。谢谢你
./mongoimport -d testdb -c testcollection --type csv --columnsHaveTypes -f
"RECEIVEDDATE.date(2006-01-02 15:04:05)" --file location/test.csv
sed -i -e "1d" location/test.csv
db.testcollection.find().forEach( function (x) {
x.RECEIVEDDATE = new Date(x.RECEIVEDDATE ); db.testcollection .save(x);});