0

我有以下代码:

  def all: String = {

    val query = BSONDocument("name" -> BSONDocument("$ne" -> "allDocs"))

    val cursor = carsCollection.find(query).cursor[BSONDocument]
    Logger.debug("Before cursor")
    cursor.enumerate.apply(Iteratee.foreach {
      doc =>
        Logger.debug("found document: " + doc.getAs[BSONString]("name").get.value)
        //Logger.debug("found document: " + doc.getAs[BSONString]("area").get.value)
    })
    "Ok"
  }

当我运行此代码时,播放控制台会显示"name"来自 12 个不同文档的字段mongodb。当我取消注释第二个 Logger 调用时,系统只打印一个名称并停止。该字段"area"存在于数据库中,没有问题。

难道我做错了什么?

4

1 回答 1

1

我的猜测是这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}")
}
于 2013-07-15T12:51:40.873 回答