使用 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 的值。
上下文
我的 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 的值。