使用从键派生的值更新 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;
我正在尝试将 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;