web-dev-qa-db-ja.com

Java MongoDB / BSONクラスの混乱

Java MongoDBドライバー(重要な場合は公式の非同期ドライバー)で使用されるBSON実装を理解しようとしています。

しかし、私はBSONドキュメントを表すクラスに完全に固執しています。今のところ怠惰な構造のような機能を無視して、「通常の」ものに集中しています。これまでのところ、私は見つけました:

  • BasicBSONObject
  • BsonDocument
  • 資料
  • BSONObject、BasicBSONObjectによって実装されているが、他のインターフェイスでは実装されていないインターフェイス

また、MongoDBドライバーは、デフォルトでその結果をDocumentインスタンスとして返し、BsonDocumentを返すように変更できることもわかりました。 OTOH、JSONクラスはDBObjectを返したいと考えています。DBObjectはBasicDBObjectによって実装され、BasicBSONObjectを拡張します。

これらのクラスはどのように関連していますか?その場合、どちらを使用する必要がありますか?

BSONドキュメントをパラメータとして受け入れる、または返すコードを作成する場合、どのタイプを使用する必要がありますか?これは実際に私が最も興味を持っている質問ですが、上記の制限は矛盾しているようです。

16
Martin Geisse

3.0ドライバーより前は、すべてのBSONドキュメントは、org.bsonパッケージのインターフェイスであるBSONObjectのインスタンスとして表されていました。ドライバーAPI(DBCollectionなど)は、BSONObjectのサブインターフェイスであるDBObjectの要件をさらに課しました。ドライバのほとんどのユーザーは、DBObjectを実装する具象クラスとしてBasicDBObjectに依存していました。

さらに、JSONから解析してJSONにシリアル化するJSONクラスは、DBObjectのインスタンスを生成して予期します。

新しい3.0ドライバーのCRUDAPI(MongoCollection)では、DBObjectがDBCollectionで果たした役割が分割されています。

MongoCollectionは汎用です(MongoCollection <TDocument>)。ジェネリック型は、insertOneなどの書き込みメソッドに使用され、コレクションにドキュメントをクエリするメソッドのデフォルトのドキュメントタイプでもあります。

  • void insertOne(TDocumentドキュメント)
  • FindIterable find()

クエリ結果を表すために使用されるクラスのデフォルトはTDocumentですが、次のようなメソッドを呼び出すことで変更できます。

  • FindIterable find(Class <TResult> resultClass)
  • AggregateIterable集計(List <?extends Bson>パイプライン、Class <TResult> resultClass)

ドライバーの作成者は、これらのタイプが既存のPOJOクラスである可能性があるため、これらのタイプにできるだけ制限を加えたくありませんでした。唯一の要件は、クラスのコーデックがMongoCollectionのコーデックレジストリに登録されていることです。詳細については、 ここ を参照してください。

クエリフィルター、更新仕様、並べ替え基準などのエンティティを表すために使用されるBSONドキュメントの場合、ドライバーは、この目的で使用されるクラスが Bson と呼ばれる新しいインターフェイスを実装するという要件を課します。 BasicDBObject、Document、およびBsonDocumentはすべてそのインターフェイスを実装しているため、任意のインターフェイスを使用することも、独自のカスタムタイプを作成することもできます。ドライバー自体は、 Filters クラスのメソッドのように、ほとんどの新しいビルダー静的ファクトリメソッドからBsonのインスタンスを返します。

最後に、管理コマンドの結果を表すBSONドキュメントを返すヘルパーメソッド(汎用コマンドの実行など)の場合、ドライバーはデフォルトでDocumentのインスタンスを返します。

JSONとDocumentまたはBsonDocumentの間の変換が必要な場合は、それらのクラスで直接定義されているparseメソッドとtoJsonメソッドを使用できます。その下では、これらは3.0で導入された新しいJsonReaderクラスとJsonWriterクラスに依存しています。詳細については、 ここ を参照してください。

著者はまだ既存のJSONクラスを廃止していませんが、将来のリリースで廃止される可能性があります。

これらのクラスのどれを使用するかに関して、私はこのアドバイスを提供します:

  • 2.13からアップグレードしてDB/DBCollectionを引き続き使用する場合は、引き続きDBObjectを使用する必要があります。これは、DBObjectに依存しない新しい非同期ドライバーには適用されません。
  • 新しいMongoCollectionベースのアプリケーション(syncまたはasync)の場合は、Documentクラスを使用します。
  • 簡潔さを犠牲にして型安全性を好む場合は、BsonDocumentを使用してください。 BsonDocumentはMap <String、BsonValue>を実装しているため、コンパイラはサポートされていない値型を追加できませんが、Map <String、Object>を実装しているDocumentは追加します(したがって、ランタイムエラーが発生する可能性があります)。
35
jyemin