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
    命令将所有字段类型设置为字符串

  • 或者,是否有方法忽略第一行

内容如下:

MongoDB 3.4增加了对指定字段类型的支持。使用--fields、-fieldFile或--headerline指定表单中的字段名和类型。()

因此,csv文件中的第一行应该有带类型的名称。e、 g:

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);});