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)
)
}
希望对您有所帮助。
鉴于以下 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)
)
}
希望对您有所帮助。