You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL++语句更新Couchbase中的嵌套JSON数组?

问题:Couchbase文档Schema变更的SQL++更新查询验证

我在Couchbase集合中存储了如下格式的JSON文档:

{
  "cti": "B1",
  "v": 3,
  "es": {
    "lb": false,
    "mu": true,
    "t1": true
  },
  "attribs": [
    {
      "desc": "Heading",
      "id": "head",
      "name": "HEAD",
      "prop": {
        "name": "t1",
        "type": "str"
      },
      "vals": [
        {
          "em": "M",
          "isM": true
        }
      ]
    },
    {
      "desc": "Body",
      "id": "body",
      "name": "Body",
      "prop": {
        "type": "str"
      }
    }
  ]
}

需要进行Schema变更,修正现有数据:将attribs.prop.name的键名改为names,并将值从字符串类型(如"t1")转换为字符串数组类型(如["t1"])。我编写了如下SQL++更新查询,想确认该写法是否正确:

UPDATE `your_bucket`
SET attribs = ARRAY
  CASE
    WHEN v.prop.name IS NOT MISSING THEN
      OBJECT_PUT(v, 'prop', OBJECT_PUT(OBJECT_REMOVE(v.prop, 'name'), 'names', [v.prop.name]))
    ELSE v
  END
  FOR v IN attribs END
WHERE ANY v IN attribs SATISFIES v.prop.name IS NOT MISSING END;

你的查询写法是正确的,能够精准完成需求:

  1. 逻辑正确性:遍历attribs数组的每个元素,当元素的prop.name存在时,先移除prop中的name键,再添加names键并将原name的字符串值转为单元素数组;不存在该键的元素则保持原样。
  2. 效率优化:WHERE子句过滤出确实包含需要修改的attribs元素的文档,避免对无变更需求的文档执行更新操作,提升执行效率。

如果想要让代码更简洁,也可以用对象展开语法简化prop的构造(Couchbase 6.5及以上版本支持):

UPDATE `your_bucket`
SET attribs = ARRAY
  CASE
    WHEN v.prop.name IS NOT MISSING THEN
      OBJECT_PUT(v, 'prop', {**v.prop, 'names': [v.prop.name], 'name': MISSING})
    ELSE v
  END
  FOR v IN attribs END
WHERE ANY v IN attribs SATISFIES v.prop.name IS NOT MISSING END;

两种写法的效果完全一致,选择哪种取决于你的代码风格偏好。

内容的提问来源于stack exchange,提问作者axnet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 12:02:08