次のことを行うロギング アプリケーションを構築しています。
- 多くのロガーから継続的に 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でこれを行うにはどうすればよいですか? どうすれば余分な解析を保存できますか? データを保存するためにどの構造を選択しますか? 同じドキュメント内のメッセージの配列、単一のドキュメント内のメッセージのコレクション、....