[英]How to handle MongoDB ObjectIds in Play framework using Reactivemongo?
我有一个带案例类的基本模型
case class Record( id: Option[String],
data: Double,
user: String,
)
object RecordJsonFormats {
import play.api.libs.json.Json
implicit val recordFormat = Json.format[Record]
}
字段user
实际上是其他模块的ObjectId
, id
也是一个ObjectId
然后尝试在play.api.libs.json.Json
String
类型更改为BSONObjectId
宏...所以两个user
和如果用对象id
字段保存得到保存为String
而不是ObjectId
。
在Play框架中使用ObjectIds
的最佳方法是什么?
play.api.libs.json.Json
与BSONObjectId
? MongoDB有一个ObjectId类型的默认_id字段,它唯一地标识给定集合中的文档。 但是,此_id通常在应用程序域的上下文中没有语义含义。 因此,一个好的做法是引入一个额外的id字段作为文档的索引。 这个id可以只是一个Long数字,不多或少。
然后,您可以轻松地按ID搜索文档,而不关心ObjectId。
这个https://github.com/luongbalinh/play-mongo/是一个使用Play 2.4.x和ReactiveMongo的示例项目。 希望它能帮到你。
您可以覆盖默认类型_id。 您只需在案例类中指定所需的类型即可。
import java.util.UUID
import play.api.libs.json._
case class Record (_id: UUID = UUID.randomUUID())
object Record {
implicit val entityFormat = Json.format[Record]
}
对于使用官方Mongo Scala驱动程序和Play Framework 2.6+的用户,这是我的解决方案: https ://gist.github.com/ntbrock/556a1add78dc287b0cf7e0ce45c743c1
import org.mongodb.scala.bson.ObjectId
import play.api.libs.json._
import scala.util.Try
object ObjectIdFormatJsonMacro extends Format[ObjectId] {
def writes(objectId: ObjectId): JsValue = JsString(objectId.toString)
def reads(json: JsValue): JsResult[ObjectId] = json match {
case JsString(x) => {
val maybeOID: Try[ObjectId] = Try{new ObjectId(x)}
if(maybeOID.isSuccess) JsSuccess(maybeOID.get) else {
JsError("Expected ObjectId as JsString")
}
}
case _ => JsError("Expected ObjectId as JsString")
}
}
在您的业务对象中使用它:
case class BusinessTime(_id: ObjectId = new ObjectId(), payRate: Double)
object BusinessTime {
implicit val objectIdFormat = ObjectIdFormatJsonMacro
implicit val businessTimeFormat = Json.format[BusinessTime]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.