Я получил запрос на обновление couchbase 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
Есть ли способ добиться ограничения размера хранимого массива с помощью одного оператора обновления?
EDIT:
с выбранным ответом и дополнительным кейсом для новых документов я придумал окончательное решение:
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 *