我正在尝试将.getAs[T](String)
方法包装在Reactive Mongo的BSONDocument类中,这样我就可以给出属性的路径,而不仅仅是名称。这是我提出的代码:
def getPropertyFromBSONWithTransform[T1, T2](transform: T1 => T2, doc: BSONDocument, path: List[String]): Option[T2] = {
def getPropertyFromBSON[T1](doc: Option[BSONDocument], path: List[String]): Option[T1] = doc match {
case None => None
case Some(d) => path match {
case List() => error("Shouldnt be here")
case s :: List() => d.getAs[T1](s)
case x :: xs => getPropertyFromBSON[T1](d.getAs[BSONDocument](x), xs)
}
}
val value = getPropertyFromBSON(Some(doc), path)
value match {
case None => None
case Some(x) => Some(transform(x))
}
}
然而,现在它抱怨没有读者。确切的错误:
Error:(26, 40) could not find implicit value for parameter reader: reactivemongo.bson.BSONReader[_ <: reactivemongo.bson.BSONValue, T1]
case s :: List() => d.getAs[T1](s)
^
我知道如何为一种类型解决这个问题,但我想保持函数通用,所以我不需要为我需要的每种类型创建它。因为我想尽可能地将读者与数据分离,所以我不想为它做一个类来阅读它。
答案 0 :(得分:0)
我想,你忘了将隐式阅读器传递给main方法。这应该是有效的。
def getPropertyFromBSONWithTransform[T1, T2](transform: T1 => T2, doc: BSONDocument, path: List[String])(implicit reader: BSONDocumentReader[T1]): Option[T2] = {
def getPropertyFromBSON(doc: Option[BSONDocument], path: List[String]): Option[T1] = doc match {
case None => None
case Some(d) => path match {
case List() => sys.error("Shouldnt be here")
case s :: List() => d.getAs[T1](s)
case x :: xs => getPropertyFromBSON(d.getAs[BSONDocument](x), xs)
}
}
getPropertyFromBSON(Some(doc), path).map(transform)
}