使用mongoimport导入CSV文件可以导入NULL吗?
问题描述:
我想使用mongoimport从CSV导入到mongodb 3.4中,我希望将空列导入为字段的空值。使用mongoimport导入CSV文件可以导入NULL吗?
我在mongoimport文档的印象之下,如果--ignoreBlanks没有被指定,我会得到我想要的行为。
--ignoreBlanks
Ignores empty fields in csv and tsv exports. If not specified, mongoimport creates fields without values in imported documents.
然而,当我尝试没有--ignoreblanks加载这个样本数据:
field_1.string(),field_2.int32(),field_3.string()
A,5,B
C,,D
E,7,F
然后我得到的是任何领域的错误不是一个字符串。
mongoimport --collection null_test --type csv --headerline --columnsHaveTypes --file null_test.csv --verbose
2017-08-08T16:55:42.989+0000 filesize: 67 bytes
2017-08-08T16:55:42.989+0000 using fields: field_1,field_2,field_3
2017-08-08T16:55:43.001+0000 connected to: localhost:27017
2017-08-08T16:55:43.001+0000 ns: DEV.null_test
2017-08-08T16:55:43.001+0000 connected to node type: standalone
2017-08-08T16:55:43.001+0000 using write concern: w='1', j=false, fsync=false, wtimeout=0
2017-08-08T16:55:43.001+0000 using write concern: w='1', j=false, fsync=false, wtimeout=0
2017-08-08T16:55:43.001+0000 Failed: type coercion failure in document #1 for column 'field_2', could not parse token '' to type int32
2017-08-08T16:55:43.001+0000 imported 0 documents
对于字符串字段,它加载一个空字符串而不是null。
我在这里做错了什么?是否可以使用带有CSV或TSV文件的mongoimport将字段加载为NULL?
对于什么是值得的,如果我使用mongoimport导入带有NULL的json文件,它将导入它们就像实际的NULL一样好。
[
{
"field1": "A",
"field2": null,
"field3": "C"
},
{
"field1": 1,
"field2": 5,
"field3": null
}
]
答
MongoDB不会从CSV数据导入空值。
我猜那是因为它没有考虑到查询"field": null
将返回那里"field"
缺少或空的所有文件太大的意义。
-ignoreBlanks
选项将简单地阻止导入从缺省字段创建空字符串(""
)值,否则这些字段将是默认值。
你可以得到你想要的东西,不过,通过后期处理使用下面的更新您输入的文件:
collection.update({'field_2': {$exists: false}}, {$set: {'field_2': null}})
“的MongoDB绝不会为您导入空值。”但是这是错误的。如果我使用mongoimport导入json而不是csv或tsv,它肯定会导入null。 – ScottMcG
很好,我稍微回答了我的答案。好吧? – dnickless
更好,但我希望它是我想听到的答案:)。让我犹豫的部分是--ignoreblanks的文档说“如果不指定 ,mongoimport会在导入的 文档中创建没有值的字段。”也许这是我的RDB背景,但如果不是空值,什么是“没有价值的领域”?如果它本来不应该创造这个领域,为什么会使用这个措辞? – ScottMcG