使用从键派生的值更新 Couchbase 文档

updating Couchbase doc with value derived from key

我正在尝试将 Couchbase 文档从一种结构更新为另一种结构 这是当前结构

{
    "config": {
        "160x600": {
            "siteId": "123455677"
        },
        "300x250": {
            "siteId": "123455677"
        },
        "300x600": {
            "siteId": "123455677"
        }
    }
}

所需的结构是

{
    "config": {
        "160x600": {
            "siteId": "123455677",
            "size":[160,600]
        },
        "300x250": {
            "siteId": "123455677",
            "size" : [300,250]
        },
        "300x600": {
            "siteId": "123455677",
            "size": [300,600]
        }
    }
}

基本上我想遍历 config 中的键,在 'x' 上拆分每个键并将结果数组作为值分配给 config[key] 中的 "size"。

这是我试过的一个 N1QL 查询(显然没有用,因此这里有这个问题);

update AppBucket a set a.config[`size`].size = split(size, `x`) for size in OBJECT_NAMES(a.config) end
where meta(a).id like 'cnfg::40792';

提前致谢。

如果您需要访问动态字段,您必须在点(地图访问)之后立即使用数组括号,即 config.[v] 和 v 必须是字符串或评估为字符串。它计算数组括号内的表达式,它必须是字符串,然后转换为标识符并替换它并计算路径的其余部分。例如:config.["xyz"] ==> config.xyz,config.[f1](f1 是 "field1")===> config.field1

此外,拆分键必须是字符串而不是标识符,即 "x"

INSERT INTO default VALUES ("cnfg::40792", { "config": { "160x600": { "siteId": "123455677", "size":[160,600] }, "300x250": { "siteId": "123455677", "size" : [300,250] }, "300x600": { "siteId": "123455677", "size": [300,600] } } });

UPDATE default AS a USE KEYS "cnfg::40792"
SET a.config.[v].size = SPLIT(v, "x") FOR v IN OBJECT_NAMES(a.config) END;

更新后的 ARRAY 将包含字符串,即 ["160","600"]。如果您需要数字,请使用以下命令。如果字符串无法转换为数字,它将转换为 NULL。

UPDATE default AS a USE KEYS "cnfg::40792"
SET a.config.[v].size = ARRAY TO_NUMBER(v1) FOR v1 IN SPLIT(v, "x") END
           FOR v IN OBJECT_NAMES(a.config) END;