在mongodb中保存并找到json字符串

时间:2013-08-12 14:57:06

标签: java mongodb database-design mongodb-java

我正在构建一个执行以下操作的日志记录应用程序:

  • 连续从许多记录器获取JSON字符串并将其保存到db
  • 将收集的数据作为每个记录器批量提供

我的目的是使用基于文档的NoSQL存储来立即拥有批量结构。经过一些研究后,我决定选择MongoDB,因为它具有以下特点: - 将数据插入现有结构的全面功能($ push,(capped)collection) - 使用我选择的密钥自动分片(因此我可以在每个记录器的基础上进行分片,因此可以立即提供批量数据 - 所有数据已经​​在同一个数据库服务器上)

我从记录器获得的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"}
  }
]

记录器可以在同一个数组中发送多个元素。我这个例子只是一个。

我开始使用mongo驱动程序在Java中编码,我发现的第一个问题是:我必须解析我的毫无疑问的有效JSON才能将其保存在mongoDB中。我了解到这是因为BSON是MongoDB的原生格式。我本来希望直接将JSON字符串转发到db以节省额外的执行时间。

所以我在第一次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)

我尝试通过mongo shell保存这个JSON,它运行正常。

如何在Java中完成此操作? 我怎么可能保存额外的解析? 您会选择哪种结构来保存数据?同一文档中的消息数组,单个文档中的消息集合,......

1 个答案:

答案 0 :(得分:1)

因为数组而无法正常工作。您需要BasicDBList才能保存多条消息。这是我的新解决方案,完美无缺:

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