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

如何使用mongoimport导入JSON树结构而非单个文档?

处理MongoDB导入嵌套JSON树结构的技巧

针对你遇到的mongoimport把整个嵌套JSON作为单个文档导入的问题,这里提供几种用MongoDB Shell(mongo.exe)和PHP处理树结构的实用技巧,同时解答你关于手动添加_id的疑问:

一、使用MongoDB Shell(mongo.exe)拆分嵌套结构

如果需要把JSON中的嵌套数组拆分成独立文档,可以先将整个JSON导入临时集合,再用Shell脚本遍历拆分:

  1. 第一步:导入原始JSON到临时集合
    执行以下命令导入你的文件:

    mongoimport --db your_database_name --collection temp_import --file your_json_file.json
    
  2. 第二步:拆分嵌套数组到目标集合
    打开MongoDB Shell,根据你需要拆分的部分编写脚本:

    • 拆分T数组中的人员数据:
      db.temp_import.find().forEach(doc => {
        // 遍历每个T数组元素,关联原文档的赛事信息
        doc.Spele.T.forEach(person => {
          person.game_date = doc.Spele.Laiks;
          person.viewers = doc.Spele.Skatitaji;
          person.venue = doc.Spele.Vieta;
          // 插入到新集合
          db.people.insertOne(person);
        });
      });
      
    • 拆分Komanda中的球员数据:
      db.temp_import.find().forEach(doc => {
        doc.Spele.Komanda.forEach(team => {
          team.Speletaji.Speletajs.forEach(player => {
            player.team_name = team.Nosaukums;
            player.game_info = {
              date: doc.Spele.Laiks,
              venue: doc.Spele.Vieta,
              viewers: doc.Spele.Skatitaji
            };
            db.team_players.insertOne(player);
          });
        });
      });
      

二、使用PHP处理嵌套结构并导入

如果更熟悉PHP,可以直接读取JSON文件,解析后遍历嵌套结构,将子文档逐个插入MongoDB:

<?php
// 读取并解析JSON文件
$jsonData = file_get_contents('your_json_file.json');
$gameData = json_decode($jsonData, true);

// 连接MongoDB
$mongoManager = new MongoDB\Driver\Manager("mongodb://localhost:27017");

// 处理T数组中的人员数据
foreach ($gameData['Spele']['T'] as $person) {
    // 关联赛事基础信息
    $person['game_date'] = $gameData['Spele']['Laiks'];
    $person['viewers'] = $gameData['Spele']['Skatitaji'];
    $person['venue'] = $gameData['Spele']['Vieta'];
    
    // 插入到集合
    $bulkWrite = new MongoDB\Driver\BulkWrite;
    $bulkWrite->insert($person);
    $mongoManager->executeBulkWrite('your_database.people', $bulkWrite);
}

// 处理球队球员数据
foreach ($gameData['Spele']['Komanda'] as $team) {
    foreach ($team['Speletaji']['Speletajs'] as $player) {
        $player['team_name'] = $team['Nosaukums'];
        $player['game_details'] = [
            'date' => $gameData['Spele']['Laiks'],
            'venue' => $gameData['Spele']['Vieta'],
            'viewers' => $gameData['Spele']['Skatitaji']
        ];
        
        $bulkWrite = new MongoDB\Driver\BulkWrite;
        $bulkWrite->insert($player);
        $mongoManager->executeBulkWrite('your_database.team_players', $bulkWrite);
    }
}
?>

三、关于手动添加_id的疑问

手动添加"_id" : { "$oid" : "50906d7fa3c412bb040eb577" }无法解决你遇到的问题:

  • _id只是MongoDB文档的唯一标识,添加它只会让整个嵌套JSON作为一个带有指定ID的单个文档导入,不会拆分嵌套的树结构。
  • 如果你的需求本来就是保留整个树结构作为单个文档,那添加_id可以指定它的唯一ID,但这和你不想让它作为单个文档导入的需求无关。

内容的提问来源于stack exchange,提问作者Pavels

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:26:34