1

次のことを行うロギング アプリケーションを構築しています。

  • 多くのロガーから継続的に JSON 文字列を取得し、データベースに保存します
  • 収集されたデータをロガーごとのバルクとして提供します

私の意図は、ドキュメントベースの NoSQL ストレージを使用して、すぐにバルク構造を持つことです。いくつかの調査の後、次の機能のために MongoDB を使用することにしました: - 既存の構造にデータを挿入するための包括的な関数 ($push、(キャップされた) コレクション) - 選択したキーによる自動シャーディング (ロガーごとにシャーディングできるようにするため)したがって、すぐに大量のデータを提供します - すべてのデータはすでに同じデータベースサーバーにあります)

ロガーから取得した 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"}
  }
]

ロガーは、同じ配列で複数の要素を送信できます。この例は 1 つにすぎません。

私は mongo ドライバーを使用して Java でコーディングを開始しましたが、最初に発見した問題は、mongoDB に保存できるようにするために、間違いなく有効な JSON を解析する必要があることでした。これは、BSON が MongoDB のネイティブ フォーマットであることが原因であることがわかりました。その余分な実行時間を節約するために、JSON 文字列を db に直接転送したかったのです。

したがって、この JSON 文字列だけを保存するために最初の Java テストで行うことは次のとおりです。

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でこれを行うにはどうすればよいですか? どうすれば余分な解析を保存できますか? データを保存するためにどの構造を選択しますか? 同じドキュメント内のメッセージの配列、単一のドキュメント内のメッセージのコレクション、....

4

1 に答える 1

1

配列が原因で機能しませんでした。複数のメッセージを保存できるようにするには、BasicDBList が必要です。完全に機能する私の新しいソリューションは次のとおりです。

    BasicDBList data = (BasicDBList) JSON.parse(loggerMessage);
    for(int i=0; i < data.size(); i++){
        coll.insert((DBObject) data.get(i));
    }
于 2013-08-15T09:41:45.253 に答える