Bagaimana cara menangani ObjectIds MongoDB dalam kerangka Play menggunakan Reactivemongo?

Saya memiliki model dasar dengan kelas kasus

case class Record( id: Option[String], 
                 data: Double,
                 user: String,
                 )

object RecordJsonFormats {
  import play.api.libs.json.Json

  implicit val recordFormat = Json.format[Record]
}

Bidang user sebenarnya adalah ObjectId dari modul lain juga id juga merupakan ObjectId namun kemudian coba ubah tipe String menjadi makro BSONObjectId di play.api.libs.json.Json break... sehingga bidang user dan jika disimpan dengan bidang objek id disimpan sebagai String bukan ObjectId.

Apa cara optimal untuk beroperasi dengan ObjectIds dalam kerangka Play?

  • Mungkin saya harus memperpanjang play.api.libs.json.Json dengan BSONObjectId?
  • Mungkin ada cara untuk menautkan model dan ID dilacak secara otomatis tanpa perlu mendeklarasikannya dalam model?

person PovilasID    schedule 06.03.2015    source sumber


Jawaban (3)


Anda dapat mengganti tipe default _id. Anda hanya perlu menentukan tipe yang Anda inginkan di kelas kasus.

import java.util.UUID
import play.api.libs.json._

case class Record (_id: UUID = UUID.randomUUID())

object Record {
  implicit val entityFormat = Json.format[Record]
}
person Rémi Lavolée    schedule 14.11.2016

MongoDB memiliki bidang _id default dengan tipe ObjectId, yang secara unik mengidentifikasi dokumen dalam koleksi tertentu. Namun, _id ini biasanya tidak memiliki arti semantik dalam konteks domain aplikasi. Oleh karena itu, praktik yang baik adalah dengan memasukkan kolom id tambahan sebagai indeks dokumen. id ini cukup berupa angka panjang, tidak lebih dan tidak kurang.

Kemudian, Anda dapat mencari dokumen berdasarkan id dengan mudah, dan tidak terlalu peduli dengan ObjectId.

Ini, https://github.com/luongbalinh/play-mongo/, adalah contohnya proyek menggunakan Play 2.4.x dan ReactiveMongo. Semoga ini membantu Anda.

person Luong Ba Linh    schedule 31.07.2015

Bagi mereka yang menggunakan Driver Mongo Scala Resmi dan Play Framework 2.6+, Inilah solusi saya: 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")
  }
}

Gunakan seperti ini di objek bisnis Anda:

case class BusinessTime(_id: ObjectId = new ObjectId(), payRate: Double)

object BusinessTime {
  implicit val objectIdFormat = ObjectIdFormatJsonMacro
  implicit val businessTimeFormat = Json.format[BusinessTime]
}
person Taylor Brockman    schedule 17.10.2018