Play Mongo 模塊簡介 頂 原

Play Mongo 是什麼?

Play Mongo 是一個專門爲 Play Framework 開發的 MongoDB 模塊, 該項目基於 MongoDB 官方的 Scala 驅動,並且提供了更多的實用功能,例如,

  • 更簡潔多樣的數據庫交方式
  • 自動識別模型類(Model),自動編解碼
  • 自動完成 JsValue 和 BsonValue 互轉
  • 更方便的 GridFS 交互
  • Change Stream 轉 Akka Stream.
  • 支持關聯查詢(Relationship Query)

爲什麼開發 Play Mongo ?

目前除了 Play Mongo,你還可以選擇,

Mongo Scala Driver 是 MongoDB 官方維護的 Scala 驅動,該驅動底層基於官方的 Java 驅動,在此基礎上提供了一層很薄的 Scala 包裝。Mongo Scala Driver 提供了一套基於 Java 的 Bson Api,無法與 Play Json 集成。另外 Mongo Scala Driver 並沒有實現 Reactive Streams 規範,而是實現了一套與 Reactive Streams 類似的 Reactive Api,即 Observable, Subscription 和 Observer。另外 Mongo Scala Driver 的數據庫操作默認返回 Observable 類型,如果你忘記了調用 toFuture 方法,或是沒有消費返回數據,則數據庫操作實際上並不會被執行,在開發中很容易引入一些Bug。

ReactiveMongo 是 Play Framework 團隊成員私下維護的項目,似乎並沒有得到官方的支持。該項目基於 Akka 和 Netty 重新實現了 MongoDB 通信協議,並且基於 Scala 實現了一套原生的 Bson Api。該項目提供了一個 Play 模塊,實現了 Bson 和 Json 的自動轉換。ReactiveMongo 主要有三個問題,一是版本更新不夠及時,無法跟上 MongoDB 的更新節奏;二是可能存在安全隱患,容易造成生產事故,詳情參考:issue#721。三是語法過於繁瑣,向開發者暴露了太多細節,例如批量插入操作:

 val docs = seq.map(c => implicitly[statChatCol.ImplicitlyDocumentProducer](c.toStatChat))
collection.bulkInsert(false)(docs: _*)

讓開發者編寫類似implicitly[statChatCol.ImplicitlyDocumentProducer]這樣的代碼似乎不太合適。

小結

正是由於以上陳述的種種問題才最終導致 Play Mongo 的誕生。Play Mongo 基於官方驅動開發,可以爲開發者提供最佳的穩定性,並能及時跟進 MongoDB 的版本升級。Play Mongo 不會過多關注底層驅動的實現細節,而是將關注點放在與 Play Framework 的集成上,爲開發者提供舒適的開發體驗。 關於 Play Mongo 的開發文檔請參考: https://github.com/playcommunity/play-mongo/blob/master/README-CN.md

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章