сохранить и найти строку json в mongodb

Я создаю приложение для ведения журнала, которое делает следующее:

  • постоянно получает строки JSON от многих регистраторов и сохраняет их в БД
  • подает собранные данные как массив для каждого регистратора

я намерен использовать хранилище NoSQL на основе документов, чтобы сразу получить объемную структуру. После некоторых исследований я решил выбрать MongoDB из-за следующих особенностей: - комплексные функции для вставки данных в существующие структуры (коллекция $push, (capped)) основе и, следовательно, обслуживать объемные данные в кратчайшие сроки - все данные уже находятся на одном сервере БД)

JSON, который я получаю от регистраторов, выглядит так:

[
  {"bdy":{
    "cat":{"id":"36494h89h","toc":55,"boc":99},
    "dataT":"2013-08-12T13:44:03Z","had":0,
    "rng":23,"Iss":[{"id":10,"par":"dim, 10, dak"}]
  },"hdr":{
    "v":"0.2.7","N":2,"Id":"KBZD348940"}
  }
]

Регистратор может отправлять более одного элемента в одном и том же массиве. Я этот пример это только один.

Я начал кодировать на Java с помощью драйвера mongo, и первая проблема, которую я обнаружил, заключалась в следующем: мне нужно проанализировать мой, без сомнения, действительный JSON, чтобы иметь возможность сохранить его в mongoDB. Я узнал, что это связано с тем, что BSON является родным форматом MongoDB. Мне бы хотелось перенаправить строку JSON в базу данных напрямую, чтобы сэкономить дополнительное время выполнения.

так что я делаю в первом тесте Java, чтобы сохранить только эту строку JSON:

String loggerMessage = "...the above JSON string...";
DBCollection coll = db.getCollection("logData");
DBObject message = (DBObject) JSON.parse(loggerMessage);
coll.insert(message);

последняя строка этого кода вызывает следующее исключение:

Exception in thread "main" 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:767)
at com.mongodb.DBCollection.apply(DBCollection.java:756)
at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:220)
at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:204)
at com.mongodb.DBCollection.insert(DBCollection.java:76)
at com.mongodb.DBCollection.insert(DBCollection.java:60)
at com.mongodb.DBCollection.insert(DBCollection.java:105)
at mongomockup.MongoMockup.main(MongoMockup.java:65)

Я попытался сохранить этот JSON через оболочку mongo, и он отлично работает.

Как я могу сделать это на Java? Как я могу сохранить дополнительный синтаксический анализ? Какую структуру вы бы выбрали для сохранения данных? Массив сообщений в одном документе, набор сообщений в отдельных документах, ....


person Mike Dynamite    schedule 12.08.2013    source источник
comment
Возможный дубликат   -  person Thomas Mueller    schedule 12.08.2013
comment
Вы пытались удалить [] вокруг строки JSON? Если вы удалите их, все должно работать нормально.   -  person assylias    schedule 13.08.2013


Ответы (1)


Это не сработало из-за массива. Вам нужен BasicDBList, чтобы иметь возможность сохранять несколько сообщений. Вот мое новое решение, которое отлично работает:

    BasicDBList data = (BasicDBList) JSON.parse(loggerMessage);
    for(int i=0; i < data.size(); i++){
        coll.insert((DBObject) data.get(i));
    }
person Mike Dynamite    schedule 15.08.2013