簡體   English   中英

如何使用Reactivemongo在Play框架中處理MongoDB ObjectIds?

[英]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實際上是其他模塊的ObjectIdid也是一個ObjectId然后嘗試在play.api.libs.json.Json String類型更改為BSONObjectId宏...所以兩個user和如果用對象id字段保存得到保存為String而不是ObjectId

在Play框架中使用ObjectIds的最佳方法是什么?

  • 也許我應該延伸play.api.libs.json.JsonBSONObjectId
  • 也許有一種方法可以自動跟蹤模型和ID,而無需在模型中聲明它們?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM