mongoimport:导入 CSV 时为所有字段设置类型
mongoimport: set type for all fields when importing CSV
我在 导入具有 headerline.
的 mongoimport
的 CSV 时遇到多个问题
情况如下:
我有一个很大的 CSV 文件,第一行字段名称。
我知道您可以 将此行设置为用作字段名称 使用:--headerline
.
我希望所有字段类型都是字符串,但是mongoimport
将类型自动 设置为它看起来的样子。
诸如 0001
之类的 ID 将变成 1
,这可能会产生不良的副作用。
不幸的是,(据我所知)无法使用 单个命令 将它们设置为 string,但是通过命名每个字段并设置它的类型为
--columnsHaveTypes --fields "name.string(), ... "
当我这样做时,下一个问题出现了。
标题行(包含 所有字段名称 )在单独的文档中 作为值 导入。
基本上,我的问题是:
有没有办法使用 --headerline
命令将 所有字段类型 设置为字符串?
替代方法,有没有办法忽略第一行?
https://docs.mongodb.com/manual/reference/program/mongoimport/#example-csv-import-types 读作:
MongoDB 3.4 added support for specifying field types. Specify field names and types in the form .() using --fields, --fieldFile, or --headerline.
因此您在 csv 文件中的第一行 的名称应该带有类型。例如:
name.string(), ...
和 mongoimport 参数
--columnsHaveTypes --headerline --file <filename.csv>
关于如何去掉第一行的问题,可以使用管道。如果没有传递 --file
选项,mongoimport 从 STDIN 读取。例如:
tail -n+2 <filename.csv> | mongoimport --columnsHaveTypes --fields "name.string(), ... "
我找到了我满意的解决方案
基本上,我想在我的 Clojure 代码中使用 mongoimport 在数据库中导入一个 CSV 文件,并自动用它做很多事情。由于上述问题,我不得不找到解决方法,删除这个错误的文档。
我做了以下 "solve" 这个问题:
为了根据需要设置类型,我编写了一个 函数来读取第一行 ,将其放入一个向量中,然后使用 字符串连接 将这些 设置为字段 .
转动这个:id,name,age,hometown,street
进入这个: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”的文件,但是当我们对包含 header 行的文件使用此命令时,mondodb 会上传第一行也就是 header 行然后它导致错误 'cannot convert to datatype' 或上传列名也作为数据集。
不幸的是,我们不能使用“--headerline”命令来代替“--fields”。
这是我为这个问题找到的解决方案。
1) 删除 header 列并按照上述命令使用“--fields”命令上传。如果你重新使用 linux 环境,你可以使用下面的命令删除大文件的第一行,即 header line.it 对我来说需要 2-3 分钟。(取决于机器性能)
sed -i -e "1d" location/test.csv
2) 使用'--headerline' 命令上传文件,然后mongodb 使用默认标识数据上传文件types.Then 打开mongodb shell 命令使用 testdb,然后使用 运行 javascript 命令获取每条记录并将其更改为特定数据 types.But 如果文件很大,这将需要时间。
found this solution from Whosebug
db.testcollection.find().forEach( function (x) {
x.RECEIVEDDATE = new Date(x.RECEIVEDDATE ); db.testcollection .save(x);});
If you wanna remove the unnecessary rows that not fit to data type use below command.
mongodb document
'--parseGrace skipRow'
我在 导入具有 headerline.
的mongoimport
的 CSV 时遇到多个问题
情况如下:
我有一个很大的 CSV 文件,第一行字段名称。
我知道您可以 将此行设置为用作字段名称 使用:--headerline
.
我希望所有字段类型都是字符串,但是mongoimport
将类型自动 设置为它看起来的样子。
诸如 0001
之类的 ID 将变成 1
,这可能会产生不良的副作用。
不幸的是,(据我所知)无法使用 单个命令 将它们设置为 string,但是通过命名每个字段并设置它的类型为
--columnsHaveTypes --fields "name.string(), ... "
当我这样做时,下一个问题出现了。 标题行(包含 所有字段名称 )在单独的文档中 作为值 导入。
基本上,我的问题是:
有没有办法使用
--headerline
命令将 所有字段类型 设置为字符串?替代方法,有没有办法忽略第一行?
https://docs.mongodb.com/manual/reference/program/mongoimport/#example-csv-import-types 读作:
MongoDB 3.4 added support for specifying field types. Specify field names and types in the form .() using --fields, --fieldFile, or --headerline.
因此您在 csv 文件中的第一行 的名称应该带有类型。例如:
name.string(), ...
和 mongoimport 参数
--columnsHaveTypes --headerline --file <filename.csv>
关于如何去掉第一行的问题,可以使用管道。如果没有传递 --file
选项,mongoimport 从 STDIN 读取。例如:
tail -n+2 <filename.csv> | mongoimport --columnsHaveTypes --fields "name.string(), ... "
我找到了我满意的解决方案
基本上,我想在我的 Clojure 代码中使用 mongoimport 在数据库中导入一个 CSV 文件,并自动用它做很多事情。由于上述问题,我不得不找到解决方法,删除这个错误的文档。
我做了以下 "solve" 这个问题:
为了根据需要设置类型,我编写了一个 函数来读取第一行 ,将其放入一个向量中,然后使用 字符串连接 将这些 设置为字段 .
转动这个:id,name,age,hometown,street
进入这个: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”的文件,但是当我们对包含 header 行的文件使用此命令时,mondodb 会上传第一行也就是 header 行然后它导致错误 'cannot convert to datatype' 或上传列名也作为数据集。 不幸的是,我们不能使用“--headerline”命令来代替“--fields”。 这是我为这个问题找到的解决方案。
1) 删除 header 列并按照上述命令使用“--fields”命令上传。如果你重新使用 linux 环境,你可以使用下面的命令删除大文件的第一行,即 header line.it 对我来说需要 2-3 分钟。(取决于机器性能)
sed -i -e "1d" location/test.csv
2) 使用'--headerline' 命令上传文件,然后mongodb 使用默认标识数据上传文件types.Then 打开mongodb shell 命令使用 testdb,然后使用 运行 javascript 命令获取每条记录并将其更改为特定数据 types.But 如果文件很大,这将需要时间。 found this solution from Whosebug
db.testcollection.find().forEach( function (x) {
x.RECEIVEDDATE = new Date(x.RECEIVEDDATE ); db.testcollection .save(x);});
If you wanna remove the unnecessary rows that not fit to data type use below command. mongodb document '--parseGrace skipRow'