Scala隐式类

时间:2018-01-24 06:48:32

标签: mongodb scala implicit

我看到一些隐含类的意外行为。我有一个从Mongo检索的case类,并且在某些情况下包含在一个带有方便lazy val的隐式类中,以从其他相关集合中检索数据。代码看起来像

case class MyClass(
    _id: UUID, ...,
    //some fields
)

然后

object MyImplicits {

    implicit class MyRichClass(c: MyClass){
        lazy val field1: Future[Iterable[T1]] = db.findAll[T1](bson)
        lazy val field2: Future[Iterable[T2]] = db.findAll[T2](bson)
    }

}

,转换用作

import ...MyImplicits.MyRichClass
val c: MyClass...
c.field1.map(...)

我的问题是field1和field2中的Futures总是包含一个空的Iterable。我今天花了大部分时间来调试我的查询,它们在测试代码和Mongo cli中都能正常工作。

任何提示都将不胜感激。

我有一个围绕org.mongodb.scala.MongoClient的包装器,它有:

/**
* Finds all instances of T using raw mongo query
*
* @param bson search query
* @tparam T
* @return
*/
private[service] def findAll[T: ClassTag](bson: Bson): Future[Iterable[T]] = {
    val colName = resolveCollection[T]
    logger.info("colName = " + colName)
    db.getCollection[T](colName).find(equal("ownerId", "user1")).toFuture().map(t => {
      logger.info("t = " + t)
      t
    })
}


/**
* Returns collection name for given type
* @tparam T
* @return
*/
private def resolveCollection[T: ClassTag]: String = {
scala.reflect.classTag[T] match {
  case `...tag` => "collectionName"
  ....
}

}

 equal("ownerId", "user1")

是硬编码用于调试目的,以及额外的记录器。

1 个答案:

答案 0 :(得分:0)

代码实际上没有问题。我确实在查询错误的数据库,所以,是的 - 所有收集实际上都是空的。