Храните несколько документов JSON (в формате массивов строк с вложенными объектами значения ключа JSON) в MongoDB.

У меня есть файл json, где каждая строка выглядит так:

[1, "A", "B", 10, "{\"key\":\"val"}"]

Как импортировать файл с помощью API драйвера JAVA или других средств?

Используя приведенную ниже функцию:

public static void importJSONFileToDBUsingJavaDriver(String pathToFile, DB db, String collectionName) {
    // open file
    FileInputStream fstream = null;
    try {
        fstream = new FileInputStream(pathToFile);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        System.out.println("file not exist, exiting");
        return;
    }
    BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

    // read it line by line
    String strLine;
    DBCollection newColl =   db.getCollection(collectionName);
    try {
        while ((strLine = br.readLine()) != null) {
            // convert line by line to BSON
            DBObject bson = (DBObject) JSON.parse(JSONstr);
            // insert BSONs to database
            try {
                newColl.insert(bson);
            }
            catch (MongoException e) {
              // duplicate key
              e.printStackTrace();
            }


        }
        br.close();
    } catch (IOException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }


}

привел к следующей ошибке (в строке newColl.insert(bson);):

java.lang.IllegalArgumentException: BasicBSONList can only work with numeric keys, not: [_id]
at org.bson.types.BasicBSONList._getInt(BasicBSONList.java:161)
at org.bson.types.BasicBSONList._getInt(BasicBSONList.java:152)
at org.bson.types.BasicBSONList.get(BasicBSONList.java:104)
at com.mongodb.DBCollection.apply(DBCollection.java:766)
at com.mongodb.DBCollection.apply(DBCollection.java:755)
at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:242)
at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:226)
at com.mongodb.DBCollection.insert(DBCollection.java:75)
at com.mongodb.DBCollection.insert(DBCollection.java:59)
at com.mongodb.DBCollection.insert(DBCollection.java:104)

Попытка использовать утилиту mongoimport.exe:

mongoimport --db db --collection dbColl  < rows.js

привело к:

exception:BSON representation of supplied JSON is too large: code FailedToParse: FailedToParse: Expecting '{': offset:0

Я был бы рад, если бы кто-нибудь мог порекомендовать мне спецификацию формата JSON, которая приемлема для MongoDB. (я имею в виду, что его можно преобразовать в BSON, затем из него можно построить DBObject, и этот объект можно вставить в коллекцию MongoDB)


person rok    schedule 24.10.2013    source источник
comment
На какой линии не работает? Что такое MongoDBFunctions.convertJSONStringToBSON? Проблема может быть в нем.   -  person Trisha    schedule 24.10.2013
comment
Да, прости. Я отредактировал вопрос и источник исключения.   -  person rok    schedule 24.10.2013


Ответы (1)


Вы пытаетесь создать DBObject из строки, которая на самом деле является массивом, поэтому напрямую вы не можете привести его к типу, используя JSON.parse(JSONstr) . Итак, вы должны сначала преобразовать свою строку в объект, а затем вставить ее.

    String JSONstr = "[1, \"A\", \"B\", 10,{\"key\":\"val\"}]";
    JSONArray jsonArray = new JSONArray(JSONstr);
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("data", jsonArray);
    DBObject bson = (DBObject) JSON.parse(jsonObject.toString());
    WriteResult insert = newColl.insert(bson);
person Jhanvi    schedule 25.10.2013
comment
Спасибо. Но что такое JSONArray, JSONObject? Я не могу найти его в API-интерфейсе JAVA-драйвера MongoDB. - person rok; 27.10.2013
comment
@ user1264304 Вы можете загрузить банку из здесь - person Jhanvi; 28.10.2013