You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含集合数组的大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格式:

  1. 先提取集合名:
$collectionName = jq -r 'keys[]' $_.FullName
  1. 转换文档为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:27:47