我有导入带有mongoimport
且具有标题的CSV的多个问题。
以下是这种情况:
我有一个很大的 CSV文件,其中第一行中的字段名称。
我知道您可以将此行设置为字段名称:--headerline
。
我希望所有字段类型都是字符串,但mongoimport
会自动将类型设置为。
0001
之类的ID将变为1
,这可能会产生不良副作用。
不幸的是,(据我所知)没有办法用单一命令将它们设置为字符串,而是命名每个字段并使用
设置类型--columnsHaveTypes --fields "name.string(), ... "
当我这样做时,出现了下一个问题。 标题行(所有字段名称)在单独的文档中导入为值。
基本上,我的问题是:
有没有办法使用--headerline
命令将所有字段类型设置为字符串?
另外,有没有办法忽略第一行?
答案 0 :(得分:1)
将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分钟。(取决于机器性能)
sed -i -e "1d" location/test.csv
2)使用'--headerline'命令上传文件,然后mongodb使用默认的识别数据类型上传文件。然后打开mongodb shell命令使用testdb,然后运行javascript命令获取每个记录并将其更改为特定数据类型。但是,如果文件很大,这将需要时间。 found this solution from stackoverflow
db.testcollection.find().forEach( function (x) {
x.RECEIVEDDATE = new Date(x.RECEIVEDDATE ); db.testcollection .save(x);});
如果要删除不适合数据类型的不必要的行,请使用以下命令。 mongodb document '--parseGrace skipRow'
答案 1 :(得分:0)
https://docs.mongodb.com/manual/reference/program/mongoimport/#example-csv-import-types读到:
MongoDB 3.4增加了对指定字段类型的支持。使用--fields, - fieldFile或--headerline指定表单中的字段名称和类型。
因此,csv文件中的第一行应该包含类型名称。 e.g:
name.string(), ...
和mongoimport参数
--columnsHaveTypes --headerline --file <filename.csv>
关于如何删除第一行的问题,您可以使用管道。如果没有传递--file
选项,则mongoimport从STDIN读取。 E.g:
tail -n+2 <filename.csv> | mongoimport --columnsHaveTypes --fields "name.string(), ... "
答案 2 :(得分:0)
我找到了一个解决方案,我很满意
基本上,我想在我的Clojure代码中使用mongoimport来导入数据库中的CSV文件并自动执行很多操作。由于上述问题,我必须找到解决方法,删除此错误文档。
我做了以下“解决”这个问题:
要设置我想要的类型,我写了一个函数来读取第一行,将它放在一个向量中然后使用字符串连接来设置这些作为字段。
转过来:id,name,age,hometown,street
进入:id.string(),name.string(),age.string()
等
然后我使用矢量中的值识别文档
{ name : "name"
age : "age"
etc : "etc" }
然后使用简单的remving.find()命令删除它。
希望这有助于处理同类问题。