Ограничить размер массива запроса на обновление Couchbase - PullRequest
2 голосов
/ 17 апреля 2019

Я получил запрос на обновление 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 *

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

Вы можете ограничить длину массива, используя индексированный оператор ARRAY, например:

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

Результат:

[
  {
    "$1": [
      "a",
      "b"
    ]
  }
]
0 голосов
/ 17 апреля 2019

Вы также можете использовать более гибкие выражения подзапроса (например, удалить на основе логических полей объектов) и т. Д. Если вам нужно 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

...