如何使用mongoimport导入JSON树结构而非单个文档?
处理MongoDB导入嵌套JSON树结构的技巧
针对你遇到的mongoimport把整个嵌套JSON作为单个文档导入的问题,这里提供几种用MongoDB Shell(mongo.exe)和PHP处理树结构的实用技巧,同时解答你关于手动添加_id的疑问:
一、使用MongoDB Shell(mongo.exe)拆分嵌套结构
如果需要把JSON中的嵌套数组拆分成独立文档,可以先将整个JSON导入临时集合,再用Shell脚本遍历拆分:
第一步:导入原始JSON到临时集合
执行以下命令导入你的文件:mongoimport --db your_database_name --collection temp_import --file your_json_file.json第二步:拆分嵌套数组到目标集合
打开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
相关产品推荐
相关产品推荐

