วิธีจัดการ MongoDB ObjectIds ใน Play framework โดยใช้ 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 ด้วย ดังนั้นลองเปลี่ยนประเภท String เป็น BSONObjectId มาโครใน play.api.libs.json.Json ตัวแบ่ง... ดังนั้นทั้ง user และหากบันทึกด้วยวัตถุ id ฟิลด์จะถูกบันทึกเป็น String ไม่ใช่ ObjectId

วิธีที่ดีที่สุดในการทำงานกับ ObjectIds ในกรอบงาน Play คืออะไร

  • บางทีฉันควรขยาย play.api.libs.json.Json ด้วย BSONObjectId
  • อาจมีวิธีเชื่อมโยงโมเดลและ ID ที่ถูกติดตามโดยอัตโนมัติโดยไม่จำเป็นต้องประกาศในโมเดล

person PovilasID    schedule 06.03.2015    source แหล่งที่มา


คำตอบ (3)


คุณสามารถแทนที่ประเภทเริ่มต้นของ _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]
}
person Rémi Lavolée    schedule 14.11.2016

MongoDB มีฟิลด์เริ่มต้นประเภท ObjectId _id ซึ่งระบุเอกสารในคอลเลกชันที่กำหนดโดยไม่ซ้ำกัน อย่างไรก็ตาม _id นี้โดยทั่วไปจะไม่มีความหมายทางความหมายในบริบทของโดเมนแอปพลิเคชัน ดังนั้น แนวทางปฏิบัติที่ดีคือแนะนำฟิลด์ id เพิ่มเติมเป็นดัชนีของเอกสาร id นี้อาจเป็นตัวเลขแบบยาวเท่านั้น ไม่มากหรือน้อย

จากนั้น คุณสามารถค้นหาเอกสารด้วย id ได้อย่างง่ายดาย และไม่ต้องสนใจ ObjectId มากนัก

https://github.com/luongbalinh/play-mongo/ นี่คือตัวอย่าง โปรเจ็กต์โดยใช้ Play 2.4.x และ ReactiveMongo หวังว่ามันจะช่วยคุณได้

person Luong Ba Linh    schedule 31.07.2015

สำหรับผู้ที่ใช้ไดรเวอร์ 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]
}
person Taylor Brockman    schedule 17.10.2018