Scala,couchbase - 将AsyncN1qlQueryResult转换为自定义对象

问题描述 投票:2回答:1

我有一个简单数据的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来解析文档。

scala couchbase n1ql
1个回答
2
投票

我很高兴地报告现在可以提供早期版本的原生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/)是提出任何反馈意见的最佳场所。

© www.soinside.com 2019 - 2024. All rights reserved.