首页 > 解决方案 > 向超过百万条记录的现有文档添加字段

问题描述

设想

我们在一个存储桶中有超过 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 中,但仍然需要太多时间。

问题

有什么办法可以减少这个时间吗?

标签: gocouchbasen1ql

解决方案


由于您需要添加新字段,而不是修改任何现有字段,最好使用 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/


推荐阅读