【发布时间】: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