ReactiveMongo:如何将 BSONArray 转换为 List[String]

ReactiveMongo: How to convert a BSONArray to List[String]

鉴于以下 BSONDocument...

val values = BSONDocument("values" -> BSONArray("one", "two", "three"))

如何将其转换为 List?我试过这个...

values.getAs[List[String]]("values").getOrElse(List.empty))

...但它不起作用 - 我总是得到 List.empty.

我是不是漏掉了什么?

编辑

OK...我认为值得描述真实案例。我 运行 distinct 命令,这是结果:

values: {
  values: [
    0: BSONObjectID("55d0f641a100000401b7e454")
  ],
  stats: {
    n: BSONInteger(1),
    nscanned: BSONInteger(1),
    nscannedObjects: BSONInteger(1),
    timems: BSONInteger(0),
    cursor: BSONString(BtreeCursor projectId_1)
  },
  ok: BSONDouble(1.0)
}

我需要像这样 运行sform values 到 Scala List[String]:

List("55d0f641a100000401b7e454")

这是我的解决方案。首先,我定义了一个像这样的 BSONReader[BSONValue, String]...

package object bsonFormatters {

    implicit object BSONValueStringReader extends BSONReader[BSONValue, String] {

     def read(bson: BSONValue) = bson match { 
      case oid: BSONObjectID => oid.stringify 
    }
}

...然后像这样将其导入我的伴随对象中:

import reactivemongo.bson.{BSONString, BSONDocument}
import reactivemongo.core.commands.{CommandError, BSONCommandResultMaker, Command}

case class Distinct(
  collectionName: String,
  field: String,
  query: Option[BSONDocument] = None
) extends Command[Seq[String]] {

  override def makeDocuments = BSONDocument(
    "distinct" -> BSONString(collectionName),
    "key" -> field,
    "query" -> query
  )

  val ResultMaker = Distinct
}

object Distinct extends BSONCommandResultMaker[Seq[String]] {

  import bsonFormatters._ // this makes the trick

  def apply(document: BSONDocument) = CommandError.checkOk(
    document,
    Some("distinct")
  ).toLeft(
    document.getAs[List[String]]("values").getOrElse(List.empty)
  )
}

希望对您有所帮助。