如何将含集合数组的大JSON文件正确导入MongoDB?
解决方案
你的需求完全可行,核心问题是当前JSON格式不符合mongoimport的直接导入要求——它把整个外层对象当成单文档,而--jsonArray仅支持文件本身就是纯数组的情况。下面提供两种适配方案,优先推荐PowerShell原生处理(无需额外工具,适配管控环境):
方法一:PowerShell原生处理(推荐)
直接解析JSON文件,提取集合名和文档数组,将文档转换为JSON Lines格式(每行一个独立JSON对象)后导入,完美避开单文档大小限制:
# 遍历目标目录下的所有JSON文件(可根据需要调整路径) Get-ChildItem -Path "C:\macship-inbound\*" -Filter "*.json" | ForEach-Object { # 读取并解析JSON内容 $jsonContent = Get-Content $_.FullName -Raw | ConvertFrom-Json # 获取顶层键作为集合名(因为你的JSON结构只有一个顶层键) $collectionName = $jsonContent.PSObject.Properties.Name[0] # 获取文档数组 $documents = $jsonContent.$collectionName # 将文档转换为JSON Lines格式并导入(用管道避免生成临时文件) $documents | ConvertTo-Json -Depth 100 | & "C:\MongoDBTools\bin\mongoimport.exe" ` --db "machship" ` --collection "$collectionName" ` --type "json" ` --file "-" ` # 用"-"表示从标准输入读取 --batchSize "100" ` --numInsertionWorkers "500" }
关键说明:
-Depth 100:避免ConvertTo-Json截断嵌套较深的JSON结构,可根据实际文档嵌套深度调整。--file "-":让mongoimport从标准输入读取内容,无需生成临时文件,适合大文件处理。- 集合名直接从JSON顶层键提取,比正则匹配更准确,无需依赖文件名规则。
方法二:用jq工具处理(需额外安装,适合大文件高效处理)
如果管控环境允许安装轻量工具jq,可以用它快速将JSON转换为JSON Lines格式:
- 先提取集合名:
$collectionName = jq -r 'keys[]' $_.FullName
- 转换文档为JSON Lines并导入:
jq -c '.[]' $_.FullName | & "C:\MongoDBTools\bin\mongoimport.exe" ` --db "machship" ` --collection "$collectionName" ` --type "json" ` --file "-" ` --batchSize "100" ` --numInsertionWorkers "500"
为什么之前的--jsonArray无效?
--jsonArray要求文件内容本身就是一个纯数组(如[{...}, {...}]),但你的文件是包含数组的单个对象,所以该参数无法识别数组内的子文档,仍会把整个外层对象当作单文档导入。
内容的提问来源于stack exchange,提问作者nicholas8855
相关产品推荐
相关产品推荐

