我的猜测是这doc.getAs[BSONString]("area").get.value
会引发一些异常。
您应该测试是否有值以及要确定的值的类型是什么:
cursor.enumerate.apply(Iteratee.foreach { doc =>
// ...
doc.getAs[BSONString]("area") match {
case Some(BSONString(area)) => Logger.debug(s"area is BSONString of value = $area")
case None => Logger.debug("area does not exist or is not a BSONString"
}
}
该getAs[BSONString]
方法返回一个Option[BSONString]
. 如果有一个值,但是这个值不能被解析为一个BSONString
——换句话说,当这个值不是一个 BSONString 而是一个 BSONInteger、BSONLong、BSONDocument 等时——则None
返回。由于您调用get
它,而不检查该选项是否已定义,它可能会抛出一个NoSuchElementException
.
另一种方法:
cursor.enumerate.apply(Iteratee.foreach { doc =>
// ...
doc.get("area") match {
case Some(BSONString(area)) => Logger.debug(s"area is a BSONString of value = $area")
case Some(otherBSONValue) => Logger.debug(s"area exists but is not a BSONString: $otherBSONValue")
case None => Logger.debug("area does not exist or is not a BSONString"
}
}
如果您的迭代对象中存在异常,则最终的未来可能会出错。
val future = cursor.enumerate |>>> Iteratee.foreach { doc =>
Logger.debug("found document: " + doc.getAs[BSONString]("name").get.value)
Logger.debug("found document: " + doc.getAs[BSONString]("area").get.value)
}
future.onComplete {
case Success(_) => Logger.debug("successful!")
case Failure(e) => Logger.debug(s"there was an exception! ${e.getMessage}")
}