2

我对当前 Scala couchdb 驱动程序的一个问题是它们是否可以使用“部分”模式”。我将尝试解释我的意思:我看到的库似乎都想从 JSON 文档中进行完整转换将数据库转换为 Scala 对象,处理 Scala 对象,并将其转换回 JSON。如果您的应用程序了解有关该类型对象的所有信息,这很好 --- 特别是如果它是与该数据库交互的唯一软件。但是,如果我想编写一个只知道部分 JSON 对象的小应用程序怎么办:例如,如果我只对像这样嵌入的“mybook”组件感兴趣怎么办:

{
  _id: "0ea56a7ec317138700743cdb740f555a",
  _rev: "2-3e15c3acfc3936abf10ea4f84a0aeced",
  type: "user",
  profiles: {
    mybook: {
      key: "AGW45HWH",
      secret: "g4juh43ui9hg929gk4"
    },
    .. 6 or 7 other profiles
  },
  .. lots of other stuff
}

我真的不想将整个 JSON AST 转换为 Scala 对象。另一方面,在 couchdb 中,您必须保存整个 JSON 文档,因此需要以某种方式保存。我想我真的是这样的东西:

class MyBook {
  private val userJson: JObject = ... // full JSON retrieved from the database
  lazy val _id: String = ... // parsed from the JSON
  lazy val _rev: String = ... // parsed from the JSON
  lazy val key: String = ... // parsed from the JSON
  lazy val secret: String = ... // (ditto)
  def withSecret(secret: String): MyBook = ... // new object with altered userJson
  def save(db: CouchDB) = ... // save userJson back to couchdb
}

优点:

  • 仅提取所需字段的计算成本更低
  • 除了“mybook”部分外,不必与数据库演变同步
  • 更适合部分模式的开发
  • 更安全,因为如果我们没有跟上数据库模式,那么无意删除字段的变化就会减少

缺点:

  • Scala 中的域对象并非完全独立于 couch/JSON
  • 每个对象使用更多内存

任何当前的 Scala 驱动程序都可以做到这一点吗?无论是 scouchdb 还是新的 Sohva 库,似乎都不是。

4

2 回答 2

1

只要你有一个好的 JSON 库和一个好的 HTTP 客户端库,实现一个无模式的 CouchDB 客户端库真的很容易。

这是 Java 中的一个示例:codetests

于 2012-11-03T18:15:46.927 回答
0

我的 couchDB 库使用 spray-json 进行(反)序列化,它非常灵活,可以让您忽略文档的某些部分但仍然保存它。让我们看一个简化的例子:

假设我们有这样的文件

{
  dontcare: {
      ...
  },
  important: "foo"
}

然后,您可以声明一个类来保存该文档中的信息并定义如何完成转换:

case class Dummy(js:JsValue)
case class PartialDoc(dontcare: Dummy, important: String)
implicit object DummyFormat extends JsonFormat[Dummy] {
  override def read(js:JsValue):Dummy = Dummy(js)
  override def write(d:Dummy):JsValue = d.js
}
implicit val productFormat = jsonFormat2(PartialDoc)

这将忽略其中的任何内容,dontcare但仍将其作为原始 JSON AST 安全。当然,这个例子并不像你的问题那么复杂,但它应该让你知道如何解决你的问题。

于 2012-12-20T13:06:18.150 回答