Couchbase:如何基于子值从列表中删除项目?

时间:2019-02-12 20:23:16

标签: nosql couchbase

Couchbase 2.5 +

这里是新的。我想从列表中删除一个项目,该列表中有一个子项目基于子项目的值。例如,如果我要删除列表scores中的所有记录,其中子项score < 0.2

此项的密钥为"dim::100020891::2020-10-04"

我考虑过要运行它,但是不起作用

UPDATE Q1036628 USE KEYS "dim::100020891::2020-10-04" SET scores=ARRAY_REMOVE(scores, {
      "score"< "0.2"
    })

Couchbase项目:

   [
          {
            "Q1036628": {
              "record_update_dt": "2020-10-04",
              "scores": [
                {
                  "name": "A",
                  "score": 0.01
                },
                {
                  "name": "B",
                  "score": 0.5
                },
                {
                  "name": "C",
                  "score": 0.26
                },
                {
                  "name": "D",
                  "score": 0.17
                }
              ],
              "id": "100020891"
            }
          }
        ]

2 个答案:

答案 0 :(得分:1)

您应该使用ARRAY子句。

UPDATE Q1036628 USE KEYS "dim::100020891::2020-10-04" 
SET scores = ARRAY s FOR s IN scores WHEN s.score >= 0.2 END

https://docs.couchbase.com/server/6.0/n1ql/n1ql-language-reference/collectionops.html#array

您可能需要稍微使用一下语法;我没有实例。

答案 1 :(得分:1)

只需在Johan Larson解决方案中再添加一个。

WHERE子句控制要更改的文档。 SET子句控制要更新的内容。您在SET子句中有条件。如果在scores数组中没有对象,且score <0.2仍在变异(即它更新相同的值)。为了避免这种情况,您需要具有WHERE子句。

UPDATE Q1036628 AS d USE KEYS "dim::100020891::2020-10-04" 
SET d.scores = ARRAY s FOR s IN d.scores WHEN s.score >= 0.2 END
WHERE ANY s IN d.scores SATISFIES s.score < 0.2 END;