CouchDB和部分模式的Scala驱动程序



我对当前的scala couchdb驱动程序有一个问题是他们是否可以使用"部分" schemas"。我会尝试解释我的意思:我看到的库似乎所有人都希望从数据库中的JSON DOCS进行完整的转换为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库,似乎不是。

只要您拥有一个良好的JSON库和一个良好的HTTP客户库库,实现示意性CouchDB客户端库就非常容易。

这是Java中的一个示例:代码,测试。

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

说我们有这样的文件

{
  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中的任何内容,但仍然可以作为RAW JSON AST安全。当然,这个示例不像问题中的那样复杂,但是它应该让您有一个想法解决问题。

最新更新