我有一个简单数据的case class
:
case class MyClass(
details: Details,
names: List[String],
id: String,
)
我创建了一个couchbase查询,它应该从数据库中检索所有文档:
val query = s"SELECT * from `docs`"
for {
docs<- bucket
.query(N1qlQuery.simple(query))
.flatMap((rows: AsyncN1qlQueryResult) => rows.rows())
.toList
.parse[F]
.map(_.asScala.toList)
} yield docs
parse[F]
是从Observable
转换的简单函数。这里的问题是我得到一个错误type mismatch
,说找到List[AsyncN1qlQueryResult]
而不是List[MyClass]
。我应该如何从AsyncN1qlQueryResult
转换为MyClass
对象?我正在使用Circe
来解析文档。
我很高兴地报告现在可以提供早期版本的原生Couchbase Scala SDK,其中包括支持将N1QL查询的每一行结果直接转换为您的案例类:
case class Address(line1: String)
case class User(name: String, age: Int, addresses: Seq[Address])
object User {
// Define a Codec so SDK knows how to convert User to/from JSON
implicit val codec: Codec[User] = Codecs.codec[User]
}
val statement = """select * from `users`;"""
val rows: Try[Seq[User]] = cluster.query(statement)
.map(result => result
.rows.flatMap(row =>
row.contentAs[User].toOption))
rows match {
case Success(rows: Seq[User]) =>
rows.foreach(row => println(row))
case Failure(err) =>
println(s"Error: $err")
}
这是阻止API。还有一些API可以将结果作为Futures,或者从Reactive Programming中获得Flux / Monos,因此您可以在如何获取数据方面拥有很大的灵活性。
你可以在这里看到如何开始:https://docs.couchbase.com/scala-sdk/1.0alpha/hello-world/start-using-sdk.html
请注意,这是一个alpha版本,让社区了解我们的目标,并给予他们提供反馈的机会。它不应该用于生产。论坛(https://forums.couchbase.com/)是提出任何反馈意见的最佳场所。