【问题标题】:Map MongoDB _id using Play-Reactivemongo plugin?使用 Play-Reactivemongo 插件映射 MongoDB _id?
【发布时间】:2015-01-06 13:01:30
【问题描述】:

我正在尝试使用 Play-ReactiveMongo 插件通过 Play 和 Angular 在 MongoDB 中读取/写入简单记录。该插件似乎是一个不错的选择,因为它允许您使用简单的案例类和常规 JSON,而不是在 BSON 和 JSON 之间显式转换。但是使用该插件的几个示例似乎并未涵盖如何在同一框架内将 MongoDB 对象 ID 映射到 JSON 或从 JSON 映射。这一切似乎都可以在后台使用大量隐式(对我来说很神奇)读取/写入,但它们似乎无法处理对象 ID。

我的代码基于 Alex Lashford 的 Modern Web Template,与 Stephan Godbillion's example using JSON Read/Writes 非常相似,但 Alex 和 Stephan 都没有显示与 MongoDB 对象 ID 有任何关系。

我的数据记录需要某种唯一 ID,因此我可以获取和更新它们等,使用 MongoDB 提供的 ID 是有意义的,但我似乎无法找到一种在内部干净地使用它的方法Play ReactiveMongo 插件。

是否有人知道一个示例,该示例显示了如何将 Play ReactiveMongo 插件与 JSON 集合一起使用,以及以某种方式将对象 ID 映射到 JSON 或从 JSON 映射,而无需将我的所有处理转换为使用 BSON?

【问题讨论】:

  • 如果可能你使用 scala salat,他们有关于 mongo 和 scala 的良好文档,并且很容易与 play 集成github.com/leon/play-salat
  • 谢谢,yogesh。 Salat 可能是一种选择,但这需要我重新编写现有代码并实现大量映射代码。 Play ReactiveMongo 插件似乎给了我 90% 的我需要的东西,除了对象 ID。如果我需要为对象 ID 实现一些显式映射,那可能仍然比切换到 Casbah/Salat 更容易。我只需要了解如何做到这一点。

标签: mongodb scala playframework play-reactivemongo


【解决方案1】:

我通过创建另一个case 类解决了这个问题:

case class Id($oid: String)

然后按如下方式使用:

case class User(_id: Id, ...)

您必须导入 Json 转换器

implicit val idFormat = Json.format[Id]
implicit val userFormat = Json.format[User]

【讨论】:

    【解决方案2】:

    我不知道为什么 reactivemongo 团队决定在 BSON 中使用 ObjectId,而不是在 JSON 中。无论如何,您可以按如下方式构造 MongoDB ObjectId 的 json 表示:

    import play.api.libs.json._
    def objectId(id: String) = Json.obj("$oid" -> id)
    yourCollection.find(Json.obj("_id" -> objectId(id))).cursor()...
    

    【讨论】:

      猜你喜欢
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 2015-05-08
      • 1970-01-01
      • 2016-01-21
      相关资源
      最近更新 更多