Mongoimport CSV编号被修改,导致意外结果

时间:2016-01-31 03:19:01

标签: mongodb csv bignum mongoimport

我尝试使用mongoimport导入CSV文件,但事实证明导入会更改数据本身。

如果你有这样的CSV文件:(file.csv

"SN","Description","OK"
"123456789012345","I should end up in 123456789012345","true"
"1234567890123456","I should end up in 1234567890123456","true"
"12345678901234567","I should end up in 12345678901234567","false"
"123456789012345678","I should end up in 123456789012345678","false"
"1234567890123456789","I should end up in 1234567890123456789","false"
"12345678901234567891","I should end up in 12345678901234567891","false"
"123456789012345678912","I should end up in 123456789012345678912","false"
"1234567890123456789123","I should end up in 1234567890123456789123","false"

然后执行以下命令:

mongoimport -h XXXXXXX --port=XXXXXXX -u XXXXXXX -p XXXXXXX -vvv --db XXXXXXX --collection XXXXXXX --headerline --type csv --file /path/to/file.csv

你最终会在mongodb数据库中遇到奇怪的事情。例如(这里显示的一些结果):

...
{
    _id: ObjectId("56ad7a292e47ad18eb25a405"),
    SN: 12345678901234568,
    Description: "I should end up in 12345678901234567",
    OK: "false"
}, {
    _id: ObjectId("56ad7a292e47ad18eb25a406"),
    SN: 123456789012345680,
    Description: "I should end up in 123456789012345678",
    OK: "false"
}, {
    _id: ObjectId("56ad7a292e47ad18eb25a407"),
    SN: 123456789012345680000,
    Description: "I should end up in 123456789012345678912",
    OK: "false"
}, {
    _id: ObjectId("56ad7a292e47ad18eb25a40b"),
    SN: 1.2345678901234568e+21,
    Description: "I should end up in 1234567890123456789123",
    OK: "false"
}
...

最后一个号码是1234567890123456

因此,似乎有大数字的字符串会转换为数字。问题在于处理方式,导致意外结果。

我尝试使用以下版本的mongoimport:

  1. mongoimport版本:3.0.5 git版本:9da01528ee677e1790bb0b506c816ca9fbe0a6a8

  2. 版本2.6.12-pre-(提交b9894192b989d40acdb49aebcb9e64ddf67db1e1)

  3. mongoimport版本:3.2.0-rc5 git版本:6186100ad0500c122a56f0a0e28ce1227ca4fc88

  4. 我通常不使用mongoimport,但这应该是导入一些mysql CSV转储的最简单方法,而且它绝对不是。

1 个答案:

答案 0 :(得分:0)

是的,问题是将长号修剪为最大整数值。

但是,使用mongoexport时无法转换数字的数据类型。其中一个解决方案是在后端脚本中编写一个小脚本(使用python / php等)或从mongo读取数据的javascript文件,以预期的格式处理它,将预期的数字转换为字符串

示例:

mongoData  = db.collection_name.find(mongoQuery)
for(var row in mongoData)
{
     print "n"+row["long_field"].toString()+","+row["other_field1"]+","+...

}

我故意在长号的开头加上n,好像你试图在MS excel或任何其他工具中打开它,它会再次被修剪。

然后您可以在控制台上以mongo mongoscript.js > /tmp/a.csv

运行此功能

其他相关来源:

mongoimport choosing field type

Mongoimport csv files with string _id and upsert