我必须更改我的一个 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/