【发布时间】:2015-11-11 02:51:05
【问题描述】:
我想构建一个通用方法来将 Scala 案例类转换为 Mongo 文档。
一个有前途的Document constructor是
fromSeq(ts: Seq[(String, BsonValue)]): Document
我可以将案例类转换为 Map[String -> Any],但是我丢失了使用隐式转换到 BsonValues 所需的类型信息。也许 TypeTags 可以帮助解决这个问题?
这是我尝试过的:
import org.mongodb.scala.bson.BsonTransformer
import org.mongodb.scala.bson.collection.immutable.Document
import org.mongodb.scala.bson.BsonValue
case class Person(age: Int, name: String)
//transform scala values into BsonValues
def transform[T](v: T)(implicit transformer: BsonTransformer[T]): BsonValue = transformer(v)
// turn any case class into a Map[String, Any]
def caseClassToMap(cc: Product) = {
val values = cc.productIterator
cc.getClass.getDeclaredFields.map( _.getName -> values.next).toMap
}
// transform a Person into a Document
def personToDocument(person: Person): Document = {
val map = caseClassToMap(person)
val bsonValues = map.toSeq.map { case (key, value) =>
(key, transform(value))
}
Document.fromSeq(bsonValues)
}
<console>:24: error: No bson implicit transformer found for type Any. Implement or import an implicit BsonTransformer for this type.
(key, transform(value))
【问题讨论】: