包装时,Reactive Mongo无法找到读者.getAs()

时间:2015-09-23 15:31:45

标签: mongodb scala bson reactivemongo

我正在尝试将.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)
                                   ^

我知道如何为一种类型解决这个问题,但我想保持函数通用,所以我不需要为我需要的每种类型创建它。因为我想尽可能地将读者与数据分离,所以我不想为它做一个类来阅读它。

1 个答案:

答案 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)
}