首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mongodb文档到Scala case类

Mongodb文档到Scala case类
EN

Stack Overflow用户
提问于 2018-05-09 15:24:48
回答 2查看 1.5K关注 0票数 3

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

代码语言:javascript
运行
复制
private val client: MongoClient = MongoClient()
private val database: MongoDatabase = client.getDatabase(“rulemgntdb”)
val WorkOrdercollection: MongoCollection[Document] = database.getCollection("workOrder")

查找查询:

代码语言:javascript
运行
复制
MongoFactory.WorkOrdercollection.find().collect().subscribe(
     (results: Seq[Document]) =>
           println(s”Found: #${results}“)

   ) 

打印结果如下:

代码语言:javascript
运行
复制
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类。

Case类如下所示:

代码语言:javascript
运行
复制
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
    )

如果我执行以下操作从文档中获取JSON字符串:

代码语言:javascript
运行
复制
MongoFactory.WorkOrdercollection.find(query).subscribe(
  (user: Document) => println(user.toJson()),                         // onNext
  (error: Throwable) => println(s"Query failed: ${error.getMessage}"), // onError
  () => println("Done")                                               // onComplete
)

然后,我将获得以下JSON字符串:

代码语言:javascript
运行
复制
{ “_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 } }

我可以在“startDate” : { “$date” : 1525781377952 }中将JSON字符串解析为case类but...Look,但无法将MongoDB日期解析为scala日期。

如何将文档映射到Case类?

EN

回答 2

Stack Overflow用户

发布于 2018-05-09 16:25:08

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

代码语言:javascript
运行
复制
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]
}
票数 1
EN

Stack Overflow用户

发布于 2018-05-09 16:53:18

您可以使用JSON库。

play-json

代码语言:javascript
运行
复制
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")
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50247718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档