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]
读取。