如何编写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;
你的查询写法是正确的,能够精准完成需求:
- 逻辑正确性:遍历
attribs数组的每个元素,当元素的prop.name存在时,先移除prop中的name键,再添加names键并将原name的字符串值转为单元素数组;不存在该键的元素则保持原样。 - 效率优化: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
相关产品推荐
相关产品推荐

