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