java - 如何更改 CouchDB 数据库中所有文档的结构?

标签 java couchdb ektorp

我必须更改我的一个 CouchDB 数据库中包含特定字段的所有现有文档的结构。 现在,该字段只是一个简单的字符串,例如:

{
  // some other fields
  "parameters": {
     "typeId": "something",
     "otherField": "dont_care"
  }
}

在这个例子中,我感兴趣的字段是“typeId”。 我想使它成为一个字符串数组,因为对此的要求已修改:( 但是我显然需要在所有文档中保留该字段的当前值!因此,根据上面的示例,结果将是:

{
  // some other fields
  "parameters": {
     "typeId": [ "something" ] // now we can have more items here
     "otherField": "dont_care"
  }
}

有什么想法可以实现吗??

以防万一这有帮助:我的 Java 网络应用程序通过 Ektorp 库与 CouchDB 通信。

最佳答案

我会说先写一个函数(或方法,或类),将旧式文档转换为新式文档,并在必要时正确处理不相关的文档(例如设计文档)。编写一些单元测试,直到您对这段代码有信心为止。

下一步基本上是一个循环,使用您的修改例程查找旧式文档并将它们更新为新式文档。

如果您的数据集很小,您可以简单地查询 /_all_docs?include_docs=true 并一次性处理整个数据集。如果你有一个更大的数据集,也许写一个 View 来识别旧式文档

function(doc) {
  // map function for "to_do" view
  if(doc.parameters && typeof doc.parameters == "string")
    emit(doc._id, doc)
}

此 View 将向您显示所有要执行 的旧式文档。要获取 50 个以上的文档进行转换,GET /my_db/_design/converter/_view/to_do?limit=50。每行的 “value” 字段将是文档的完整副本,因此您可以立即通过转换器函数运行它。

转换文档后,您可以将其 POST 回数据库,或者构建一个批处理并使用 _bulk_docs 执行相同的操作。 (批量文档是一样的,只是快一点。)随着每个文档的存储,它将从 to_do View 中消失。 (如果您收到 409 Conflict 错误,请忽略它。)重新运行此过程,直到 to_do 中有 0 行,您就完成了!

你可以从你的情况判断你需要多小心。如果这是生产数据,你最好写好单元测试!如果它是开发环境,那就去吧!

最后一个技巧是创建一个新的空数据库并将主数据库复制到其中。现在您有一个重复的沙箱来尝试您的想法。您可以删除并重新复制您的沙盒,直到您对结果满意为止。

关于java - 如何更改 CouchDB 数据库中所有文档的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8816781/

相关文章:

java - 动画出现、旋转和消失

csv - 从 CouchDB 创建 CSV View

javascript - Couchdb 按键过滤并按另一个字段排序

javascript - 无法使用 $.couch.login 授权 couchdb

couchdb - 使用 Ektorp ExecuteBulk () 和 ExecuteAllOrNothing () API 在 Cloudant CouchDB 中执行批量更新时出错

java - Spring中的日期时间格式

java - ImageIO写入特定的tiff

java - 在 Java 中使用嵌套的 try 语句

来自 ektorp/couchdb 的 JSON 响应

java - 内联 View 定义 Couch Db Ektorp