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

Mongodb ReactiveMongo:如何将BSONArray转换为List[String],mongodb,scala,reactivemongo,Mongodb,Scala,Reactivemongo,给定以下b文档 val values = BSONDocument("values" -> BSONArray("one", "two", "three")) 如何将其转换为列表?我试过这个 values.getAs[List[String]]("values").getOrElse(List.empty)) 。。。但它不起作用-我总是得到列表。空的 我错过什么了吗 编辑 好的。。。我认为这是值得描述的真实情况。我运行了distinct命令,结果如下: values: { valu

给定以下
b文档

val values = BSONDocument("values" -> BSONArray("one", "two", "three"))
如何将其转换为
列表
?我试过这个

values.getAs[List[String]]("values").getOrElse(List.empty))
。。。但它不起作用-我总是得到
列表。空的

我错过什么了吗

编辑

好的。。。我认为这是值得描述的真实情况。我运行了
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)
}
我需要将
转换为Scala
列表[字符串]
如下:

List("55d0f641a100000401b7e454")
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)
  )
}

这是我的解决办法。首先,我定义了一个
BSONReader[BSONValue,String]
如下

package object bsonFormatters {

    implicit object BSONValueStringReader extends BSONReader[BSONValue, String] {

     def read(bson: BSONValue) = bson match { 
      case oid: BSONObjectID => oid.stringify 
    }
}
。。。然后将其导入到我的同伴对象中,如下所示:

List("55d0f641a100000401b7e454")
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)
  )
}

我希望有帮助。

打印文档
values
检查:
println(s“values:${BSONDocument pretty values}”)
查看我的更新帖子。Tx;-)元素类型不是
BSONString
而是
BSONObjectID
,数组不能作为
List[String]
读取,而是作为
List[BSONObjectID]
读取。