当前位置: 首页 > 知识库问答 >
问题:

Java:将json数组插入MongoDB时出错

慕容弘懿
2023-03-14

我正在将CSV文件插入MongoDB。首先,我将CSV转换为Json格式的数组(参考:https://dzone.com/articles/how-to-convert-csv-to-json-in-java)然后尝试将其上载到MongoDB,但遇到以下错误(只有当CurrentBSONType为DOCUMENT时,才能调用readStartDocument,而当CurrentBSONType为ARRAY时,则不能调用readStartDocument):

Exception in thread "main" org.bson.BsonInvalidOperationException: readStartDocument can only be called when CurrentBSONType is DOCUMENT, not when CurrentBSONType is ARRAY.
    at org.bson.AbstractBsonReader.verifyBSONType(AbstractBsonReader.java:692)
    at org.bson.AbstractBsonReader.checkPreconditions(AbstractBsonReader.java:724)
    at org.bson.AbstractBsonReader.readStartDocument(AbstractBsonReader.java:452)
    at org.bson.codecs.DocumentCodec.decode(DocumentCodec.java:148)
    at org.bson.codecs.DocumentCodec.decode(DocumentCodec.java:45)
    at org.bson.Document.parse(Document.java:105)
    at org.bson.Document.parse(Document.java:90)
    at com.ucm.json.ConnectMongoDB.connectToMongoDB(ConnectMongoDB.java:52)
    at com.ucm.json.Main.main(Main.java:15)

我的JSON字符串(结果)如下所示:

[ {
  "query" : "ecn",
  "type" : "KeywordMatch",
  "url" : "http://insidedell.com/ecn",
  "description" : "ECN"
}, {
  "query" : "product marketing",
  "type" : "PhraseMatch",
  "url" : "http://dellemc.com/product",
  "description" : "Products"
}, {
  "query" : "jive",
  "type" : "ExactMatch",
  "url" : "http://test.com/jive",
  "description" : "Jive test"
} ]

下面是我的代码:步骤1:将CSV转换为JSON格式的字符串数组

public class CreateJSON {

    public String query;
    public String type;
    public String url;
    public String description; 
    String result ;
    public CreateJSON() {

    }
    public CreateJSON(String query,String type,String url,String description) {
        this.query = query;
        this.type = type;
        this.url = url;
        this.description = description;

    }

    public String createJsonFromCSV() throws IOException{
        String csvFile = "C:\\Projects\\frontKeymatch_default_frontend.csv";

        List<CreateJSON> createObjects = null;
        Pattern pattern = Pattern.compile(",");
        try (BufferedReader in = new BufferedReader(new FileReader(csvFile));){

            createObjects = in.lines().map(line ->{
                String[] x = pattern.split(line);
                return new CreateJSON(x[0],x[1],x[2],x[3]);

            }).collect(Collectors.toList());


             ObjectMapper mapper = new ObjectMapper();
             mapper.enable(SerializationFeature.INDENT_OUTPUT);
             result =  mapper.writeValueAsString(createObjects);

        } 
         return result;

    }
}

步骤2)连接到MongoDB并插入数据

public class ConnectMongoDB{
    public void connectToMongoDB(String resultFromCSV) throws JsonGenerationException, JsonMappingException, IOException {

    MongoClient mongo = new MongoClient( "localhost" ,27017);
    Document doc = Document.parse(resultFromCSV);

            mongo.getDatabase("db").getCollection("collection").insertOne(doc);

            System.out.println("success");

        }
   }    

第三步:我的主要方法:

public class Main {

    public static void main(String[] args) throws FileNotFoundException, IOException {

        CreateJSON upload = new CreateJSON();
        ConnectMongoDB mongo = new ConnectMongoDB();
        mongo.connectToMongoDB(upload.createJsonFromCSV());
    }

}

感谢您的帮助。谢谢

共有2个答案

狄新翰
2023-03-14

在我的例子中,我错过了我的MongoRepository(即我写的文章)中关于组线的花括号

@Aggregation(pipeline = {
        "$group: { _id: { $dateToString: { date: '$createdDate', format: '%Y-%m' } }, count: { $sum: 1 } }"
})
AggregationResults<SubmissionCount> getSubmissionsCountPerMonth();

而不是

@Aggregation(pipeline = {
        "{ $group: { _id: { $dateToString: { date: '$createdDate', format: '%Y-%m' } }, count: { $sum: 1 } } }"
})
AggregationResults<SubmissionCount> getSubmissionsCountPerMonth();
佘修为
2023-03-14

没有从json数组到文档的直接转换。文件解析处理单个文档,这是错误的原因。

您可以更新方法以删除中间的CreateJSON对象和ObjectMapper,并直接将csv行映射到文档,并将它们收集为列表。

将下面的方法作为静态方法移动到主类并使用Insert众多插入所有文档。

主要方法。

public class Main {

public static void main(String[] args) throws FileNotFoundException, IOException {
    ConnectMongoDB mongo = new ConnectMongoDB();
    mongo.connectToMongoDB(createJsonFromCSV());
}

public static List<Document> createJsonFromCSV() throws IOException {
    String csvFile = "C:\\Projects\\frontKeymatch_default_frontend.csv";
    List<Document> createObjects = null;
    Pattern pattern = Pattern.compile(",");
    try (BufferedReader in = new BufferedReader(new FileReader(csvFile));){
          createObjects = in.lines().map(line ->{
             String[] x = pattern.split(line);
             return new Document("query",x[0]).append("type", x[1]) //append other fields
          }).collect(Collectors.toList());
       }
     return createObjects;
    }
}

public class ConnectMongoDB{
    public void connectToMongoDB(List<Document> docs) throws IOException {
    MongoClient mongo = new MongoClient( "localhost" ,27017);
    mongo.getDatabase("db").getCollection("collection").insertMany(docs);
    System.out.println("success");
   }
}   
 类似资料:
  • 我试图插入一个json字符串,它包含一个文档数组,但得到以下异常。 MongoDB服务器版本: Mongo-Java驱动程序版本: 我知道方法只用于插入一个文档,但这里是一个数组文档。我不确定在这里如何使用方法。 请引导。 要插入的JSON字符串: 异常日志: main.java GenericUtils.java pom.xml

  • 我正在使用LogStash1.5.2 尝试使用logstash-output-mongoDB在MongoDB中插入数据 它只有在解析的日志不包含数组时才会正常工作,当JSON包含数组时会生成异常。 无法将事件发送到MongoDB 未定义的MethodBSON_TYPE NOMethodError:未定义#NOMethodError的方法`error_code':0x39794292 有什么办法可以

  • 所以我有一个选择题列表,我想存储,每次用户回答相同的问题,他对这个问题的答案。所以我想创建一个文档每个用户和他的回答历史每个问题。我做了一个问题数组,其中包含了questionId和一个答案数组(“ans”和他的答案。所以我写了一个基本代码,在这里我为问题1添加了他的第一个答案“a”,现在我想用答案“b”更新这个文档。 我知道这是一个非常基本的问题,但我已经搜索了其他问题,但我无法得到语法工作。我

  • 我有一个将数据插入PostgreSQL表的Mulesoft流。数据类型为JSON。这是数据的副本:(我从调试器中抓取了这个,因为它即将调用插入命令) 当我尝试将其插入JSON列时,我得到了这个错误 所以我决定把它插入一个文本列,这就是它的样子 请注意,在“id”之后添加了“=”而不是“:”,并删除了引号。 我不知道为什么会这样。基本上,我只需要将JSON数据插入JSON列。 谢谢

  • 问题内容: 我正在使用mongo 2.2.3和Java驱动程序。我的困境是,我必须将一个字段和值推入一个数组中,但是我似乎无法弄清楚该如何做。我的数据样本: 我可以在外壳中插入: 但是当我将其翻译成Java时,我迷惑了自己,将键盘卡在墙上。 到目前为止,我的Java代码(不完整和错误): 问题答案:

  • 问题内容: 我正在尝试将文档插入Node.js中的MongoDB中。我已经从数据库中成功读取了文件,并通过命令行界面添加了文档。但是,我无法从JavaScript插入文档。如果这样做,我会收到一个错误: 错误:没有提供的回调无法使用writeConcern 这是我的代码: 我无法终生弄清楚为什么会出现此错误。 我做错了什么,我应该怎么做呢? 问题答案: 您需要为调用提供回调函数,以便该方法可以将插