【问题标题】:N1QL couchbase query - Update array within a dynamic JSON object. (Removing an element of array nested inside Json object)N1QL couchbase 查询 - 更新动态 JSON 对象中的数组。 (删除嵌套在 Json 对象中的数组元素)
【发布时间】:2019-05-14 06:54:38
【问题描述】:

我正在尝试编写 N1QL 更新查询。我想从数组中删除那些“vs”值是什么的对象,比如说“k_a”。 这是我的示例文档。

{
  "ADD": {
    "k_2": [
      {
        "allowed": false,
        "vs": "k_a"
      },
      {
        "allowed": false,
        "vs": "k_d"
      }
    ],
    "k_9": [
      {
        "allowed": false,
        "vs": "k_f"
      },
      {
        "allowed": true,
        "vs": "k_a"
      }
    ]
  },
  "REMOVE": {
    "k_4": [
      {
        "allowed": true,
        "vs": "k_a"
      }
    ],
    "k_7": [
      {
        "allowed": false,
        "vs": "k_g"
      },
      {
        "allowed": true,
        "vs": "k_a"
      }
    ]
  }
}

我已经尝试过这个查询 -

UPDATE bucket_name sp
    SET obj = ARRAY v FOR v IN obj WHEN v.vs != "k_a" END
    FOR obj IN OBJECT_VALUES(sp.ADD) END WHERE META(sp).id = "SPT|O|789"

但可能我做错了什么。

这是我期待更新后的文件 -

{
  "ADD": {
    "k_2": [
      {
        "allowed": false,
        "vs": "k_d"
      }
    ],
    "k_9": [
      {
        "allowed": false,
        "vs": "k_f"
      }
    ]
  },
  "REMOVE": {
    "k_4": [],
    "k_7": [
      {
        "allowed": false,
        "vs": "k_g"
      }
    ]
  }
}

注意 - 这里的关键字“ADD”和“REMOVE”是静态的,但“k_number”或“k_letter”形式的任何东西都是动态的,可以是任何东西。

我们将不胜感激。

【问题讨论】:

    标签: arrays json couchbase n1ql


    【解决方案1】:

    Where 子句控制文档是否必须改变。 SET 子句控制要改变的内容。您需要 where 子句来避免不必要的突变(例如:如果第二次重复相同的更新,则不应有任何更新,即突变计数应为 0,除非有人更改了文档。)。

    UPDATE sourceprioritization sp USE KEYS "SPT|O|789"
        SET sp.[obj1.name].[obj.name] = ARRAY v FOR v IN obj.val WHEN v.vs != "k_a" END
        FOR obj IN OBJECT_PAIRS(obj1.val)
               FOR obj1 IN OBJECT_PAIRS(sp) WHEN obj1.name IN ["ADD", "REMOVE"] AND "k_a" IN obj.val[*].vs END
    WHERE ANY obj1 IN OBJECT_PAIRS(sp) SATISFIES obj1.name IN ["ADD", "REMOVE"]
          AND (ANY obj IN OBJECT_PAIRS(obj1.val) SATISFIES "k_a" IN obj.val[*].vs END) END;
    

    UPDATE sourceprioritization sp USE KEYS "SPT|O|789"
        SET obj1.val.[obj.name] = ARRAY v FOR v IN obj.val WHEN v.vs != "k_a" END
        FOR obj IN OBJECT_PAIRS(obj1.val)
               FOR obj1 IN OBJECT_PAIRS(sp) WHEN obj1.name IN ["ADD", "REMOVE"] AND "k_a" IN obj.val[*].vs END
    WHERE ANY obj1 IN OBJECT_PAIRS(sp) SATISFIES obj1.name IN ["ADD", "REMOVE"]
          AND (ANY obj IN OBJECT_PAIRS(obj1.val) SATISFIES "k_a" IN obj.val[*].vs END) END;
    

    【讨论】:

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