6

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

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

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

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

4

2 回答 2

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]
于 2015-06-30T09:17:19.497 回答
1

我不知道为什么 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()...
于 2016-08-16T07:21:40.203 回答