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(), ... "

当我这样做时,下一个问题出现了。 标题行(包含 所有字段名称 )在单独的文档中 作为值 导入。

基本上,我的问题是:

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'