Java对接MongoDB插入用户输入记录时触发异常问题求助
问题诱因
- 核心报错原因是
Create.java中每次运行都会主动调用database.createCollection("students")方法:首次运行时集合不存在可以创建成功,第二次及以后运行时,集合已经存在,MongoDB会直接抛出集合已存在的异常,这就是你重复输入内容运行时报错的根本原因。 - 其次你的插入逻辑存在逻辑错误:你创建了要插入的
document对象,但没有将它加入到待插入的list中,写的遍历空list的循环没有任何作用,最终insertMany操作实际插入的是空列表,要么无数据写入,要么会触发空插入异常。 - 代码中存在大量无用导入,比如
javax.print.Doc、java.sql.SQLOutput等,虽然不影响运行,但会增加冗余。
修复方案
1. 优化集合创建逻辑
MongoDB默认在插入数据时如果目标集合不存在会自动创建,完全不需要主动调用createCollection方法,直接删除该行代码即可;如果有必须主动创建的场景,也可以先判断集合是否存在再执行创建操作。
2. 修复插入逻辑
如果仅插入单条数据,直接使用insertOne方法即可,无需用insertMany操作;如果确实需要批量插入,记得将创建好的文档对象加入到待插入列表中。
3. 可选优化:用try-with-resources管理连接
Java 7+的try-with-resources语法可以自动关闭MongoDB连接,无需手动调用close()方法,避免资源泄漏。
修复后代码示例
Create.java
import com.mongodb.ConnectionString; import com.mongodb.MongoClientSettings; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoDatabase; import org.bson.Document; import java.util.Scanner; public class Create { private static final Scanner scanner = new Scanner(System.in); public static void main(String args[]) { ConnectionString connectionString = new ConnectionString("mongodb+srv://USER:PASSWD@CLUSTER.mongodb.net/mydb?retryWrites=true&w=majority"); MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(connectionString) .build(); // try-with-resources自动关闭连接 try (MongoClient mongoClient = MongoClients.create(settings)) { MongoDatabase database = mongoClient.getDatabase("test"); System.out.println("Enter any string:"); String inputValue = scanner.nextLine(); // 直接获取集合,不存在会自动创建,无需主动createCollection Document document = new Document("name", inputValue); // 单条插入直接用insertOne database.getCollection("students").insertOne(document); System.out.println("Document inserted successfully"); } } }
Read.java
import com.mongodb.ConnectionString; import com.mongodb.MongoClientSettings; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import org.bson.Document; import java.util.Iterator; public class Read { public static void main(String args[]) { ConnectionString connectionString = new ConnectionString("mongodb+srv://USER:PASSWD@CLUSTER.mongodb.net/mydb?retryWrites=true&w=majority"); MongoClientSettings settings = MongoClientSettings.builder() .applyConnectionString(connectionString) .build(); try (MongoClient mongoClient = MongoClients.create(settings)) { MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> collection = database.getCollection("students"); Iterator<Document> it = collection.find().iterator(); while (it.hasNext()) { System.out.println(it.next()); } } } }
内容的提问来源于stack exchange,提问作者techie_questie
相关产品推荐
相关产品推荐

