gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:41:56 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com