Couchbase N1QL:基于另一个属性更新文档属性

Couchbase N1QL:基于另一个属性更新文档属性,couchbase,n1ql,Couchbase,N1ql,我正在努力更新N1QL查询 我的文档如下所示: { "invalidityReasons": { "AU": [ "ANCESTOR_DEACTIVATED_OR_INVALID" ], "BE": [ "ANCESTOR_DEACTIVATED_OR_INVALID" ], "BG": [] } "metadata": { "configurations": { "AU": { "enabled": tru

我正在努力更新N1QL查询

我的文档如下所示:

{
"invalidityReasons": {
    "AU": [
      "ANCESTOR_DEACTIVATED_OR_INVALID"
    ],
    "BE": [
      "ANCESTOR_DEACTIVATED_OR_INVALID"
    ],
    "BG": []
}
"metadata": {
  "configurations": {
    "AU": {
      "enabled": true,
    },
    "BE": {
      "enabled": false,
    },
    "BG": {
      "enabled": true,
    }
  }
}
}
我想做什么:

对于所有具有无效原因“祖先已停用”或“祖先已停用”且已激活(即“已启用”:元数据配置中为true)=>停用此国家/地区(即“已启用”:false)的国家/地区

在上面的例子中,AU(Autralia)应该被停用

我现在的位置

这在我脑海中意味着:

  • 去所有国家
  • 查找那些无效原因=祖先\u停用\u或\u无效+启用=真的
  • 更新激活
因此,的
更新看起来相当不错,但我无法使其正常工作:

update `data` t
SET  t.metadata.configurations.[country].enabled = false
FOR country IN OBJECT_NAMES(t.metadata.configurations)
    when t.metadata.configurations.[country].enabled = true
    and array_contains(t.invalidityReasons.[country], 'ANCESTOR_DEACTIVATED_OR_INVALID') end;
Couchbase宣布突变,但我的国家仍然处于激活状态

你有什么想法吗

  • 使用N1QL是否可以实现这一点
  • 我做错了什么?:)
顺便说一下,我正在使用Couchbase EE 5.1.1

谢谢, 干杯


朱尔斯

这应该行得通。以下内容在单个文档上正常工作

insert into default values("11",{ "invalidityReasons": { "AU": [ "ANCESTOR_DEACTIVATED_OR_INVALID" ], "BE": [ "ANCESTOR_DEACTIVATED_OR_INVALID" ], "BG": [] }, "metadata": { "configurations": { "AU": { "enabled": true }, "BE": { "enabled": false }, "BG": { "enabled": true } } } } );
SELECT * FROM default USE KEYS "11";
update `default` t USE KEYS "11"
SET  t.metadata.configurations.[country].enabled = false
FOR country IN OBJECT_NAMES(t.metadata.configurations)
    when t.metadata.configurations.[country].enabled = true
    and array_contains(t.invalidityReasons.[country], 'ANCESTOR_DEACTIVATED_OR_INVALID') end;
SELECT * FROM default USE KEYS "11";

非常感谢vsr,看起来“使用钥匙”是这里成功的关键,干杯,朱尔斯使用钥匙就是一个例子。可以基于谓词更新多个文档。