我看到一些隐含类的意外行为。我有一个从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")
是硬编码用于调试目的,以及额外的记录器。
答案 0 :(得分:0)
代码实际上没有问题。我确实在查询错误的数据库,所以,是的 - 所有收集实际上都是空的。