我正在构建一个执行以下操作的日志记录应用程序:
- 连续从许多记录器获取 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"}
}
]
记录器可以在同一个数组中发送多个元素。我这个例子只是一个。
我开始使用 mongo 驱动程序在 Java 中编码,我发现的第一个问题是:我必须解析我的毫无疑问有效的 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)
我试图通过 mongo shell 保存这个 JSON,它工作得很好。
我怎样才能在 Java 中完成这项工作?我怎样才能节省额外的解析?你会选择什么结构来保存数据?同一文档中的消息数组,单个文档中的消息集合,......