限制数组大小Couchbase更新查询

限制数组大小Couchbase更新查询,couchbase,n1ql,Couchbase,N1ql,我有一个couchbase n1ql更新查询: UPDATE `store` document USE KEYS "test" SET document = ARRAY_APPEND(ARRAY_REMOVE(document, "c"), "c") 此更新将从文档中删除所有出现的给定“c”,然后将其追加到末尾 现在我还想将结果数组限制为特定的长度,这样结果就不会超过大约50个数组元素 由于数组切片不会给出propper结果,因此当数组长度小于给定切片时,需要更多的逻辑 我尝试了以下方法:

我有一个couchbase n1ql更新查询:

UPDATE `store` document USE KEYS "test" 
SET document = ARRAY_APPEND(ARRAY_REMOVE(document, "c"), "c")
此更新将从文档中删除所有出现的给定“c”,然后将其追加到末尾

现在我还想将结果数组限制为特定的长度,这样结果就不会超过大约50个数组元素

由于数组切片不会给出propper结果,因此当数组长度小于给定切片时,需要更多的逻辑

我尝试了以下方法:

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语句来限制存储数组的大小

编辑: 根据选定的答案和新文档的附加案例,我提出了以下最终解决方案:

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 *
合并到'store'文档中
在键“test_x”上使用(选择NULL)
当匹配时
更新集文档=数组\反向(
数组v代表i:v在数组_中反转(
数组\附加(数组\删除(文档“i”),“i”)
)当我<3结束时
)
当不匹配时
插入[“i”]
返回*

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

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

您还可以使用更灵活的子查询表达式(如基于对象的逻辑字段删除)等。如果您需要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"); 

这非常有用。除了将数组反转两次之外,还有什么其他的想法吗?要得到“最后的x”元素而不是“第一个x”?
更新`store`文档使用键“test”SET document=array\u REVERSE(数组中的i:v的数组v表示i:v,数组中的i:v表示i:u REVERSE(数组中的附加(数组中的移除(文档,“g”),“g”)),当i<3 END时)
这就是我想到的。它似乎可以工作,但我对反转不太满意这里有一个ARRAY_LENGTH()函数。您应该能够使用类似于WHEN i>ARRAY_LENGTH(…)-50的方法,并针对边缘情况进行一些调整。我们将在明天进行尝试
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");