go - 向超过百万条记录的现有文档添加字段
问题描述
设想
我们在一个存储桶中有超过 500 万个文档,所有文档都使用简单的 uuid 键嵌套了 JSON。我们想为所有文档添加一个额外的字段。
例子
ee6ae656-6e07-4aa2-951e-ea788e24856a
{
"field1":"data1",
"field2":{
"nested_field1":"data2"
}
}
添加额外字段后
ee6ae656-6e07-4aa2-951e-ea788e24856a
{
"field1":"data1",
"field3":"data3",
"field2":{
"nested_field1":"data2"
}
}
它只有一个主索引:CREATE PRIMARY INDEX idx FOR bucket
。
问题
这需要很长时间。我们用 n1ql 进行了尝试,UPDATE bucket SET field3 = data3
. 还有子文档突变。但所有这一切都需要几个小时。它是用 Go 编写的,因此我们可以将其放入 goroutine 中,但仍然需要太多时间。
问题
有什么办法可以减少这个时间吗?
解决方案
由于您需要添加新字段,而不是修改任何现有字段,最好使用 SDK SUBDOC API vs N1QL UPDATE(它是整个文档更新,需要获取文档)。
最好的选择是使用 N1QL 获取文档密钥,然后使用 SDK SUBDOC API 添加您需要的字段。您可以使用反应式 API(异步)
您有 5M 文档并使用以下主索引
val = ""
In loop
SELECT RAW META().id FROM mybucket WHERE META().id > $val LIMIT 10000;
SDK SUBDOC update
val = last value from the SELECT
https://blog.couchbase.com/offset-keyset-pagination-n1ql-query-couchbase/
推荐阅读
- python - 使用自动编码器重建潜在空间
- azure - Azure 搜索服务如何知道要搜索哪个索引器?
- android - 在 android studio 中自定义 TextInputLayout 和 EditText
- python - 如何对齐使用python执行的linux输出
- node.js - 尝试使用 xstate-plantuml 可视化 FSM 图时出现类型错误
- php - PHP curl文件传输
- python - 如何根据其他列的值在数据框中创建新列?
- xml - 空手道 xml bodyPath 在模拟中不匹配:场景匹配评估失败
- python - 为数据框中的日期列创建主题时间点
- python - 为什么我在处理上传图像时在 Flask 中不断收到“请求”对象没有属性“文件”?