【问题标题】:Mongoimport CSV numbers being modified, causing unexpected resultsMongoimport CSV 数字被修改,导致意外结果
【发布时间】:2016-01-31 03:19:00
【问题描述】:

我正在尝试使用 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

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

【问题讨论】:

    标签: mongodb csv bignum mongoimport


    【解决方案1】:

    是的,问题在于长数字被修剪为最大整数值。

    但是,您不能在使用 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

    【讨论】:

    • 好的,但修剪数字的方式仍然很奇怪。我刚刚意识到它可能会进行某种舍入,否则为什么 xxx45678 最终会成为 xxx45680?大概会变成 xxx456.78?
    • 但是,如果您尝试插入 123456789012345678912,数据库将存储更大的数字 12345678901234568000,这既不完全截断也不考虑 32/64 最低有效位。看起来像是在做某种舍入结合截断。
    • 它没有发生在数据库级别。当 DB 将数据发送到 o/p 以进行打印和修剪时,就会发生这种情况
    猜你喜欢
    • 2021-04-24
    • 2014-09-04
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    相关资源
    最近更新 更多