Java操作MongoDB向文档添加players数组存储全部球员数据问题
问题根因
当前代码仅能存储1名球员,是两个逻辑错误导致的:
Document.append(key, value)方法遇到重复key时会直接覆盖原有值,不会自动追加内容到数组。你在循环中反复给players这个key赋值,循环结束后只会保留最后一次录入的球员数据。- 没有提前将
players初始化为数组结构,不支持存储多个元素。
另外原有代码存在冗余:addTeamPlayer方法内重复创建Mongo客户端连接、重复初始化输入流,会造成不必要的资源开销。
修复代码
优化后的addTeamPlayer方法
移除方法内冗余的连接创建逻辑,直接传入已初始化的输入流和随机数实例,返回单个球员的Document对象:
public static Document addTeamPlayer(BufferedReader bfn, Random rand) throws IOException { int playerId = rand.nextInt(25); System.out.println("Player name: "); String playerName = bfn.readLine(); System.out.println("Age: "); int age = Integer.parseInt(bfn.readLine()); System.out.println("Position: "); String position = bfn.readLine(); System.out.println("Ranking: "); int ranking = Integer.parseInt(bfn.readLine()); return new Document("player_id", Integer.toString(playerId)) .append("player_name", playerName) .append("age", age) .append("position", position) .append("ranking", ranking); }
修复后的addTeam方法
提前初始化players为List结构存储所有球员文档,循环录入完成后再一次性赋值给队伍文档,同时用try-with-resources 自动关闭Mongo连接避免资源泄漏:
public static Document addTeam() throws IOException { try (MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017")) { MongoDatabase db = mongoClient.getDatabase("teamDB"); MongoCollection<Document> col = db.getCollection("teamCollection"); BufferedReader bfn = new BufferedReader(new InputStreamReader(System.in)); Random rand = new Random(); int teamId = rand.nextInt(25); System.out.println("Team name: "); String teamName = bfn.readLine(); System.out.println("How many players: "); int teamSize = Integer.parseInt(bfn.readLine()); Document teamDoc = new Document("_id", new ObjectId()) .append("team_id", Integer.toString(teamId)) .append("team_name", teamName); // 初始化球员列表 List<Document> players = new ArrayList<>(); for (int i = 1; i <= teamSize; i++) { System.out.println("Player " + i + "--"); players.add(addTeamPlayer(bfn, rand)); } // 把完整球员列表挂载到队伍文档 teamDoc.append("players", players); col.insertOne(teamDoc); return teamDoc; } }
运行效果
修复后插入MongoDB的文档结构完全匹配预期,players字段为数组,数组内元素数量和用户输入的队伍人数一致,每个元素对应一名球员的完整数据。
内容的提问来源于stack exchange,提问作者New CS Developer
相关产品推荐
相关产品推荐

