【问题标题】:Exception while inserting multiple user input values to Mongo db collection向 Mongo db 集合插入多个用户输入值时出现异常
【发布时间】:2021-12-11 10:59:59
【问题描述】:

我正在用 JAVA-MongoDB 编写一个基本的 CREATE 和 READ 操作。我正在尝试将用户输入的记录插入数据库并读取相同的内容。

这就是我当前代码的样子-

Create.java-
import com.mongodb.Block;
import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.client.*;
import com.mongodb.client.model.InsertManyOptions;
import org.bson.Document;

import javax.print.Doc;
import java.sql.SQLOutput;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Create {
    private static Scanner scanner = new Scanner(System.in);
    private static String inputValue;


    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();
        MongoClient mongoClient = MongoClients.create(settings);
        MongoDatabase database = mongoClient.getDatabase("test");

        System.out.println("Enter any string:");
        inputValue = scanner.nextLine();

        //Creating a collection
        database.createCollection("students");
        //Preparing a document
        Document document = new Document("name", inputValue);
        //Inserting the created documents
        List<Document> list = new ArrayList<Document>();
        for(Document d: list) {
            list.add(d);
        }
        database.getCollection("students").insertMany(list, new InsertManyOptions().ordered(false));
        System.out.println("Document inserted successfully");
        mongoClient.close();

    }
}

Read.java
import com.mongodb.Block;
import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.client.*;
import org.bson.Document;

import java.sql.SQLOutput;
import java.util.Iterator;
import java.util.Scanner;

public class Read {
    private static Scanner scanner = new Scanner(System.in);
    private static String inputValue;


    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();
        MongoClient mongoClient = MongoClients.create(settings);
        MongoDatabase database = mongoClient.getDatabase("test");




        // Read Data from MongoDB
        //Creating a collection object
        MongoCollection<Document> collection = database.getCollection("students");
        //Retrieving the documents
        FindIterable<Document> iterDoc = collection.find();
        Iterator it = iterDoc.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }

        mongoClient.close();
       // findIterable.forEach(printBlock);


    }
}

我能够成功插入和读取一条记录。但是当我尝试在提示中输入一些不同的输入时,它会引发以下异常-

【问题讨论】:

    标签: java mongodb crud


    【解决方案1】:

    错误代码几乎说明了一切。

    此数据库中已存在集合“students”

    //Creating a collection
    database.createCollection("students");
    

    这是您代码中正确的部分,但必须只运行一次,因为如果集合存在,则会抛出异常...

    所以只需将其删除并记住,通过代码创建集合会在它们已经存在时引发错误。

    你知道你插入的列表是空的吗?

    Document document = new Document("name", inputValue); // This is your created document
    
    //Inserting the created documents
    List<Document> list = new ArrayList<Document>(); // This is a list that CAN contain Documents but it is initialized and it is EMPTY
    for(Document d: list) // The for loop will not be executed at all since the list is empty...
    {
        list.add(d);
    }
    

    将您的文档添加到您的列表中。

    list.add(document);
    

    增强的for循环用于遍历List。我不确定,但你已经想到了,但你可以查看this 来了解它。

    【讨论】:

    • 谢谢!我确实意识到我的列表是空的,但我认为我需要迭代。我现在意识到我的错误。另外,我很想知道为什么我们需要删除创建集合的行。我刚刚删除了它,我的代码工作得很好,但我想知道 Mongo 如何知道要引用哪个集合,因为你可以看到这是我创建集合的唯一地方。
    • 您必须删除该行,因为 Collection 已经存在,您不需要重新创建它。或者更准确地说(Mongo不会让你)。 Mongo 将知道要引用哪个集合,因为您使用了:`database.getCollection("students").insertMany()` 您会看到 getCollection() 部分,它具有魔力。
    • 如果它解决了您的问题,请点赞并接受答案。
    • 是的,我会的。所以,这意味着我们不需要手动创建集合。我可能需要阅读更多内容。我认为 getollection 只有在之前创建过集合时才有效。
    • Mongo 有一个很好的特性。当您尝试在不存在的 DB/Collection 中插入数据时,它将自动为您创建。尝试插入不存在的数据库或不存在的集合,您会注意到:)
    猜你喜欢
    • 2020-12-19
    • 2021-04-03
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多