【问题标题】:updating Couchbase doc with value derived from key使用从键派生的值更新 Couchbase 文档
【发布时间】:2020-02-24 12:27:28
【问题描述】:

我正在尝试将 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';

提前致谢。

【问题讨论】:

  • 必须是N1QL吗?如果您事先知道文档键,那么使用键值 API 进行这种复杂的 JSON 处理可能会更容易,也可能更高效。
  • 这样的文档有数百个,因此手动更新它们将是一项艰巨的任务。我希望它是否可以通过 N1QL 查询来解决,否则最后的手段是编写一个服务来获取所有这些文档,操作它们并在 couchBase 中更新它们。谢谢。

标签: couchbase n1ql


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多