【问题标题】:Why does mongoimport work for CSV file but not JSON file with the exact same data?为什么 mongoimport 适用于 CSV 文件而不适用于具有完全相同数据的 JSON 文件?
【发布时间】:2022-01-10 09:43:32
【问题描述】:

我有一个需要数据库的非常大的数据集,我正在使用 Windows10 PowerShell 作为我的 CLI 开发环境的一部分,以及与 MongoDB 和 Python 的 shell 接口;

我选择 MongoDB 作为满足这些数据需求和未来使用 Python 进行分析的最佳解决方案;

在数据中,我有 Python 元组包含 3 个数字的单元,每个单元用逗号分隔 - (x, y, z) - 因此有必要选择分号 ; 作为 CSV 文件的分隔符;此外,MongoDB 也存在括号问题,所以我重构为 Python Lists/Arrays [x, y, z];但是,MongoDB 显然对此存在问题,因此我将数据简化为简单的文本字符串表示 "[x, y, z]",以便首先隔离下面描述的问题:

显然,MongoDB 在导入以分号作为分隔符的 CSV 文件时存在问题,因此我不得不使用制表符 "\t" 作为分隔符将数据重新计算到新的 CSV 文件中;

使用下面的mongosh shell 命令(连同状态代码消息),我能够成功地mongoimport CSV 文件创建包含集合的数据库;

./mongoimport --type tsv -d testdbcsv -c testcollection --headerline --drop dataCSV.csv
PS C:\mongodbdbtools\bin> ./mongoimport --type tsv -d testdbcsv -c testcollection --headerline --drop dataCSV.csv
2022-01-10T11:24:01.487+0200    connected to: mongodb://localhost/
2022-01-10T11:24:01.535+0200    dropping: testdbcsv.testcollection
2022-01-10T11:24:01.611+0200    30 document(s) imported successfully. 0 document(s) failed to import.
PS C:\mongodbdbtools\bin>

为了挑战 - 并测试和学习 MongoDB 的新方面 - 我还在 CSV 中创建了一个完全相同数据的 JSON 文件,以便查看和测试我从两个单独的文件创建的两个 MongoDB 数据库(使用相同的数据)将生成相同的 MongoDB 数据库;

我已经测试并验证了JSONObjectForExport 是一个有效的 JSON 文件,它是一个包含字典/对象列表/数组的 JSON 文本字符串;

但是,使用两个 Windows PowerShell 命令 mongoimport JSON 文件,我收到以下消息,具体取决于我是否添加了 --jsonArray 参数;

./mongoimport -d testdbjson -c testcollection --drop dataJSON.json --jsonArray
PS C:\mongodbdbtools\bin> ./mongoimport -d testdbjson -c testcollection --drop dataJSON.json --jsonArray
2022-01-10T11:25:05.513+0200    connected to: mongodb://localhost/
2022-01-10T11:25:05.562+0200    dropping: testdbjson.testcollection
2022-01-10T11:25:05.563+0200    Failed: error reading separator after document #1: bad JSON array format - found no opening bracket '[' in input source
2022-01-10T11:25:05.563+0200    0 document(s) imported successfully. 0 document(s) failed to import.
PS C:\mongodbdbtools\bin> 
./mongoimport -d testdbjson -c testcollection --drop dataJSON.json
PS C:\mongodbdbtools\bin> ./mongoimport -d testdbjson -c testcollection --drop dataJSON.json
2022-01-10T11:25:24.816+0200    connected to: mongodb://localhost/
2022-01-10T11:25:24.864+0200    dropping: testdbjson.testcollection
2022-01-10T11:25:24.867+0200    Failed: cannot decode string into a primitive.D
2022-01-10T11:25:24.867+0200    0 document(s) imported successfully. 0 document(s) failed to import.
PS C:\mongodbdbtools\bin>

以下是 JSON 文本字符串格式的简化 JSON 文件示例:

"[{\"KeyField1\": 0, \"KeyField2\": \"[0, 1, 2]\"}]"

所以 CSV 文件可以正常导入; JSON 文件不会导入,即使它是写入 CSV 和 JSON 文件的完全相同数据的有效 JSON;

这可能是什么问题?

感谢您的帮助;

编辑:生成每个请求的 JSON 文件的 Python 代码的更多详细信息以澄清:

## CONVERT/SERIALIZE DICTIONARY TO JSON:
JSONObjectForExport = json.dumps(ListOfDictionaries)

## BEGIN VALIDATE JSON
## BEGIN DEFINE FUNCTION
def validateJSON(jsonData):
    try:
        json.loads(jsonData)
    except ValueError as err:
        return(False)
    return(True)

## END DEFINE FUNCTION

## CALL FUNCTION
isValid = validateJSON(JSONObjectForExport)

## TEST PRINT OUTPUT
print("Given JSON string is Valid", isValid)

## END VALIDATE JSON

## WRITE DATA AS JSON FILE - 
with open("dataJSON.json", "w") as f_json:
    json.dump(JSONObjectForExport, f_json) 

编辑:事实和问题总结:

1.) Python 计算数据并将相同的数据写入有效的 CSV 和有效的 JSON 格式文件。

2.) MongoDB 成功从 CSV 导入数据以创建 db。

3.) MongoDB 以两种方式失败并显示两条不同的错误消息,因为两种代码都无法导入 JSON 格式的相同数据。

【问题讨论】:

  • 使用 monogexport 导出并将导出的文件与您的 JSON 文件进行比较,然后您应该会看到差异/问题。
  • 等等,所以你的 JSON 文件包含一个 字符串,里面有一个 JSON 数组?
  • 根据您的要求编辑更多详细信息@Sergio Tulentsev
  • 好吧,写一个数组,而不是字符串。这就是 mongoimport 告诉你的。
  • 我正在根据 JSON 的 Python 库编写一个 JSON 文件。如您所见,我尝试了mongoimport 和--jsonArray 的两种选项:我从同一个程序将数据导出为CSV 和JSON(您可以使用上面的代码查看JSON),但没有导入命令正在工作;我搜索了错误消息,但没有找到像这样的确切情况,即使用 CSV 成功导入相同的数据,但不是 JSON;

标签: json mongodb csv mongoimport


【解决方案1】:

所以我测试了一些东西,尽管上面的 JSONObjectForExport 是 Python 生成的有效 JSON,但无论出于何种原因,MongoDB 不喜欢反斜杠转义引号,所以我接下来会调查并尽快更新:

以下作品:

对于单个 JSON 对象:

./mongoimport -d testdbjson -c testcollection --drop dataJSON.json

上面的代码适用于下面的 JSON 对象:

{"KeyField1": 0, "KeyField2": [0, 1, 2]}

或

{"KeyField1": 0, "KeyField2": "[0, 1, 2]"}

对于 JSON 对象数组:

./mongoimport -d testdbjson -c testcollection --drop dataJSON.json --jsonArray

上面的代码适用于 JSON 对象作为下面的数组:

[{"KeyField1": 0, "KeyField2": [0, 1, 2]}]

或

[{"KeyField1": 0, "KeyField2": "[0, 1, 2]"}]

【讨论】:

  • 啊,很高兴看到您终于获得了正确的内容。只有你的结论是完全错误的。 “反斜杠转义引号”并不是给您带来问题的原因。是你有一个字符串而不是一个数组。
  • @Sergio Tulentsev 如您所见:字符串或数组的值都有效;该问题仍未解决,因为当我按照问题中的代码将数据写入 JSON 文件时,Python 生成的 JSON 文件不起作用;对于调试,我喜欢简化事情并编写自己的 JSON 进行测试;所以现在我需要检查 Python 输出并找出为什么它测试为有效 JSON 却被 MongoDB 拒绝。
  • 您的代码输出一个 JSON 字符串。而 mongodb 需要一个 JSON 数组。两者都是“有效的 JSON”。
  • 如果还是看不到,请将生成的文件放在手工制作的文件旁边,逐个字符进行比较。
【解决方案2】:

好的,所以今天早上测试了一些东西之后,问题是按照这里的问题将数据双重编码为​​ JSON 并使用替代解决方案:

Dump to JSON adds additional double quotes and escaping of quotes

简单地说:json.dumps() 和json.dump() 没有必要同时使用。

以下代码显示我注释掉了不必要的json.dumps() 步骤(并将其替换为仅转储ListOfDictionaries)解决了问题,现在 MongoDB 可以正常导入 JSON 对象。

结论/理论有待测试和确认:MongoDB 不喜欢带有反斜杠转义字符的双重编码:

## CONVERT/SERIALIZE DICTIONARY TO JSON:
## JSONObjectForExport = json.dumps(ListOfDictionaries) ## UNNECESSARY TO ENCODE JSON HERE
JSONObjectForExport = ListOfDictionaries

## WRITE DATA AS JSON FILE - 
with open("dataJSON.json", "w") as f_json:
    json.dump(JSONObjectForExport, f_json)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多