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"
}
}
]
答案 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;