限制数组大小Couchbase更新查询

时间:2019-04-17 11:43:42

标签: couchbase n1ql

我有一个沙发基n1ql更新查询:

UPDATE `store` document USE KEYS "test" 
SET document = ARRAY_APPEND(ARRAY_REMOVE(document, "c"), "c")

此更新将从文档中删除所有出现的给定“ c”,然后将其附加到末尾。

现在我也想将结果数组限制为特定长度,因此结果永远不会超过50个左右的数组元素

因为数组切片不会给出正确的结果,所以当数组的长度小于给定的切片时,还需要更多的逻辑。

我尝试了以下操作:

UPDATE `store` document USE KEYS "test" 
LET temp = ARRAY_APPEND(ARRAY_REMOVE(document, "c"), "c")
SET document = temp[-least(ARRAY_LENGTH(temp), 50):]

失败,因为“ LET”不是UPDATE语法的一部分

是否有任何方法可以通过使用一条update语句来限制存储数组的大小?

编辑: 有了选定的答案和新文档的另一种情况,我想出了这个最终解决方案:

MERGE INTO `store` document
USING (SELECT NULL) s ON KEY "test_x"
WHEN MATCHED THEN 
    UPDATE SET document = ARRAY_REVERSE(
        ARRAY v FOR i:v IN ARRAY_REVERSE(
            ARRAY_APPEND(ARRAY_REMOVE(document, "i"), "i")
        ) WHEN i < 3 END
    )
WHEN NOT MATCHED THEN 
    INSERT ["i"]
RETURNING *

2 个答案:

答案 0 :(得分:2)

您可以使用索引的ARRAY运算符来限制数组的长度,如下所示:

select array v for i:v in ["a", "b", "c", "d"]  when i < 2 end

结果:

[
  {
    "$1": [
      "a",
      "b"
    ]
  }
]

答案 1 :(得分:0)

您还可以使用更灵活的子查询表达式(例如,根据对象的逻辑字段删除)等。如果需要50个元素,请提供49个元素,因为最后还要添加一个。

UPDATE `store` AS document
USE KEYS "test"
SET document = ARRAY_APPEND((SELECT RAW d1 FROM document AS d1 WHERE d1 != "c" OFFSET ARRAY_LENGTH(document) - 49  LIMIT 49),"c"); 

https://docs.couchbase.com/server/6.0/n1ql/n1ql-language-reference/subqueries.html