更新具有基于密钥的值的Couchbase文档

问题描述 投票:0回答:1

我正在尝试将一个沙发基础文档从一种结构更新为另一种结构这是当前结构

{
    "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';

提前感谢。

couchbase n1ql
1个回答
1
投票

如果需要访问动态字段,则必须在点(映射访问)之后立即使用数组括号,即config。[v],并且v必须为字符串或计算为字符串

也拆分键必须是字符串而不是标识符,即“ 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;

更新后的阵列将具有字符串,即[“ 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;
© www.soinside.com 2019 - 2024. All rights reserved.