java - 保存并在mongodb中查找json字符串

标签 java mongodb database-design mongodb-java

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

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

我的目的是使用基于文档的 NoSQL 存储来立即获得批量结构。经过一番研究后,我决定选择 MongoDB,因为它具有以下功能: - 将数据插入现有结构的综合功能($push、(上限)集合) - 使用我选择的 key 进行自动分片(这样我可以在每个记录器的基础上进行分片,从而立即提供批量数据 - 所有数据都已位于同一数据库服务器上)

我从记录器获得的 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 中完成此操作? 我怎样才能节省额外的解析? 您会选择什么结构来保存数据?同一文档中的消息数组、单个文档中的消息集合......

最佳答案

由于数组的原因,它不起作用。您需要一个 BasicDBList 才能保存多条消息。这是我的新解决方案,效果完美:

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

关于java - 保存并在mongodb中查找json字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18190278/

相关文章:

java - 将kafka与jpa一起使用时的良好做法

database - 有库存管理设计模式吗?

php - 该数据库建模/设计的最佳方法是什么?

mysql - 向数据库添加订单列

java - jQuery 插件与 Dojo 插件在 Struts 2 中使用 ModelDriven

java - 将字符串颜色名称转换为颜色值(整数)

java - 你如何在@SpringBootTest 中传递程序参数?

javascript - Mongo 将 ISO 日期转换为奇怪的字符串

python - 如何处理 MongoDB (pyMongo) 中的 DuplicateKeyError?

javascript - 关于 passport.js 工作原理的问题。具体关于 user.id