使用 Couchbase N1QL 更新列表的多个元素

Update multiple elements of a list using Couchbase N1QL

上下文

我的 couchbase 文档中有一个节点,如下所示:

"metadata": {
    "configurations": {
        "AU": {
         "enabled": false,
         "order": 2147483647
        },
        "BE": {
         "enabled": false,
         "order": 2147483647
        },
        "BG": {
         "enabled": false,
         "order": 2147483647
        } ...
    } 
}

它与一个列表国家 unicodes 和他们 "enabled" 状态

我想要达到的目标

更新此文档以将所有国家/地区

标记为禁用("enabled" = false)

为了做到这一点,我希望这种语法能起作用(假设我正在尝试更新 ID 为 03c53a2d-6208-4a35-b9ec-f61e74d81dab 的文档)

UPDATE `data` t 
SET country.enabled = false
FOR country IN t.metadata.configurations END
where meta(t).id = "03c53a2d-6208-4a35-b9ec-f61e74d81dab";

但它似乎并没有改变我文档中的任何内容

有什么提示吗? :)

谢谢大家,

这个查询应该有效:

update data
use keys "03c53a2d-6208-4a35-b9ec-f61e74d81dab"
set country.enabled = true for country within metadata.configurations when 
    country.enabled is defined end

WITHIN 允许在 metadata.configurations 结构的任何级别找到 "country",我们使用 "WHEN country.enabled IS DEFINED" 来确保我们正在查看 [= 的正确类型15=]结构。

由于字段名称是动态的,您可以使用 OBJECT_NAMES() 生成字段名称并在字段更新期间使用它。

UPDATE data t USE KEYS "03c53a2d-6208-4a35-b9ec-f61e74d81dab" 
      SET  t.metadata.configurations.[v].enabled = false FOR v IN OBJECT_NAMES(t.metadata.configurations) END ;

在上面的例子中 OBJECT_NAMES(t.metadata.configurations) 生成 ["AU", "BE","BG"] 当 JSON 的字段被引用时 .[v] 它评估 v 并且值成为字段。 所以在循环构造 t.metadata.configurations.[v].enabled 期间变为

t.metadata.configurations.`AU`.enabled, 
t.metadata.configurations.`BE`.enabled, 
t.metadata.configurations.`BG`.enabled

取决于 v 的值。