2015-04-18 80 views
13

我想了解Java MongoDB驅動程序(官方的異步之一,如果是重要的)所使用的BSON實現。Java MongoDB/BSON類混淆

但是,我完全停留在代表BSON文檔的類上。我專注於「普通」,忽略了現在的懶惰建設等功能。到目前爲止,我發現:

  • BasicBSONObject
  • BsonDocument
  • 文件
  • BSONObject,通過BasicBSONObject實現而不是其他

我還發現,MongoDB的接口驅動程序默認返回其結果作爲Document實例,並且可以更改爲返回BsonDocument。 OTOH,JSON類想要返回一個DBObject,它由BasicDBObject實現,擴展BasicBSONObject。

這些類是如何相關的?在哪種情況下應該使用哪一個?

當編寫接受BSON文檔作爲參數的代碼或返回它時,我應該使用哪種類型?這實際上是我最感興趣的問題,但上述限制似乎與此相矛盾。

回答

31

在3.0驅動程序之前,所有BSON文檔均表示爲BSONObject的實例,它是org.bson包中的一個接口。驅動程序API(DBCollection等)進一步強加了BS​​Object的一個子接口DBObject的要求。驅動程序的大多數用戶都依賴BasicDBObject作爲實現DBObject的具體類。

此外,解析和序列化爲JSON的JSON類生成並期望DBObject的實例。

在新的驅動程序CRUD API(MongoCollection)中,DBObject在DBCollection中扮演的角色已被拆分。

MongoCollection是通用的(MongoCollection < TDocument>)。通用型,用於寫的方法,如insertOne,也是默認的文檔類型爲查詢文件的收集方法,如

  • 無效insertOne(TDocument文件)
  • FindIterable查找()

用於表示查詢結果默認爲TDocument類,但可以通過像調用方法被改變:

  • FindIterable查找(<類TResult> resultClass)
  • AggregateIterable aggregate(List <?擴展BSON>管道,類< TResult> resultClass)

作者想把它放到這些類型少限制越好,因爲它們可能被預先存在的POJO類的驅動程序。唯一的要求是該類的編解碼器已經在MongoCollection的CodecRegistry中註冊。有關詳細信息,請參見here

對於用於表示像查詢過濾器,更新規範,排序標準等實體的BSON文檔,驅動程序強制要求用於此目的的類實現一個名爲Bson的新接口。 BasicDBObject,Document和BsonDocument都實現了該接口,因此可以使用任何接口,也可以創建自己的自定義類型。驅動程序本身會從大多數新的構建器靜態工廠方法中返回Bson的實例,如Filters類中的那些方法。

最後,對於返回代表管理命令結果(如運行通用命令)的BSON文檔的幫助程序方法,驅動程序會默認返回Document實例。

如果您需要在JSON和Document或BsonDocument之間進行轉換,則可以使用直接在這些類上定義的parse和toJson方法。在下面,這些依賴於3.0中引入的新的JsonReader和JsonWriter類。有關更多詳細信息,請參閱here

作者還沒有棄用現有的JSON類,但最有可能將在未來的版本。這些類的

在條款才能使用,我會提供這樣的建議:

  • 如果從2.13升級和持續使用DB/DBCollection,你仍然必須使用DBOBJECT。這不適用於新的異步驅動程序,它不依賴於DBObject。
  • 對於基於MongoCollection的新應用程序(同步或異步),請使用Document類。
  • 如果您希望以簡潔爲代價選擇安全類型,請使用BsonDocument。 BsonDocument實現Map < String,BsonValue>所以編譯器不會讓你添加一個不受支持的值類型,而實現了Map,Object>的Document將會(因此運行時錯誤是可能的)。