【问题标题】:Mongodb Document to Scala case classMongodb Document to Scala 案例类
【发布时间】:2018-10-19 04:15:06
【问题描述】:

我正在使用 MongoDB scala 驱动程序。我从 MongoDB 获取记录时遇到问题。 以下是我的 MongoDB 初始化

private val client: MongoClient = MongoClient()
private val database: MongoDatabase = client.getDatabase(“rulemgntdb”)
val WorkOrdercollection: MongoCollection[Document] = database.getCollection("workOrder")

查找查询:

MongoFactory.WorkOrdercollection.find().collect().subscribe(
     (results: Seq[Document]) =>
           println(s”Found: #${results}“)

   ) 

这样打印的结果:

Found: #List(Document((_id,BsonString{value=‘5af153f49547a205f9798129’}), (workOrderId,BsonString{value=‘9a9e1ce8-c576-4a15-a1ff-4af780b14b7f’}), (thingId,BsonString{value=‘Mumbai_Robot_3’}), (alertId,BsonString{value=‘Alert_1’}), (description,BsonString{value=‘Robot is not in good condition’}), (lastViewedDate,BsonDateTime{value=1525781377952}), (suggestedMaintenanceDate,BsonDateTime{value=1525781377952}), (startDate,BsonDateTime{value=1525781377952})))

我想将此文档映射到我的案例类。

案例类是这样的:

case class WorkOrder (
           var  id  : String = (new ObjectId()).toString(),
           var  workOrderId: String,
           var  thingId  : String,
           var  alertId : String,
           var  description  : String,
            val lastViewedDate : Date,
            val suggestedMaintenanceDate : Date,
            val startDate : Date
    )

如果我为从 Document 获取 JSON 字符串执行以下操作:

MongoFactory.WorkOrdercollection.find(query).subscribe(
  (user: Document) => println(user.toJson()),                         // onNext
  (error: Throwable) => println(s"Query failed: ${error.getMessage}"), // onError
  () => println("Done")                                               // onComplete
)

然后我会得到以下 JSON 字符串:

{ “_id” : “5af153f49547a205f9798129", “workOrderId” : “9a9e1ce8-c576-4a15-a1ff-4af780b14b7f”, “thingId” : “Mumbai_Robot_3", “alertId” : “Alert_1", “description” : “Robot is not in good condition”,  “lastViewedDate” : { “$date” : 1525781377952 }, “suggestedMaintenanceDate” : { “$date” : 1525781377952 }, “startDate” : { “$date” : 1525781377952 } }

我可以将 JSON 字符串解析为案例类,但是...看看 “startDate” : { “$date” : 1525781377952 } 我无法将 MongoDB 日期解析为 scala 日期

如何将 Document 映射到 Case 类?

【问题讨论】:

    标签: mongodb scala document


    【解决方案1】:

    您需要为$date 字段提供自定义编解码器。下面显示了它在play-json 中是如何完成的,但在其他 JSON 库中的概念是相似的:

    object WorkOrder {
      implicit val dateRead: Reads[Date] =
        (__ \ "$date").read[Long].map(date => new Date(date))
    
      implicit val dateWrite: Writes[Date] = new Writes[Date] {
        def writes(date: Date): JsValue = Json.obj("$date" -> date.getTime)
      }
    
      implicit val codec = Json.format[WorkOrder]
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用 JSON 库。

      play-json

      case class WorkOrder (
        id: String,
        workOrderId: String,
        thingId: String,
        alertId: String,
        description: String,
        lastViewedDate: Date,
        suggestedMaintenanceDate: Date,
        startDate: Date
      )
      
      object WorkOrder {
        implicit lazy val fmt = Json.format[WorkOrder]
      }
      
      def documentToWorkOrder(doc: Document): WorkOrder = {
        Json.parse(user.toJson().toString).validate[WorkOrder] match {
          case JsSuccess(_, workOrderObj) => workOrderObj
          case JsError(throwable)  => throw throwable
        }
      }
      
      //then in your code
      MongoFactory.WorkOrdercollection.find(query).subscribe(
       (user: Document) => documentToWorkOrder(user),
       (error: Throwable) => println(s"Query failed: ${error.getMessage}"),
       () => println("Done")
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-29
        相关资源
        最近更新 更多