【问题标题】:Limit array size Couchbase update query限制数组大小 Couchbase 更新查询
【发布时间】:2019-04-17 11:43:42
【问题描述】:

我有一个 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 语法的一部分

有没有办法通过使用单个更新语句来限制存储数组的大小?

编辑: 有了选定的答案和新文档的附加案例,我想出了这个最终解决方案:

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 *

【问题讨论】:

    标签: couchbase n1ql


    【解决方案1】:

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

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

    结果:

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

    【讨论】:

    • 这非常有用。除了将数组反转两次以获得“最后一个 x”元素而不是“第一个 x”之外的任何想法?
    • UPDATE `store` document USE KEYS "test" SET document = ARRAY_REVERSE(ARRAY v FOR i:v IN ARRAY_REVERSE(ARRAY_APPEND(ARRAY_REMOVE(document, "g"), "g")) WHEN i &lt; 3 END) 这就是我想出的。它似乎有效,但我对逆转不太高兴
    • 有一个 ARRAY_LENGTH() 函数。您应该能够使用 WHEN i >ARRAY_LENGTH(...)-50 之类的东西,并对边缘情况进行一些调整。
    【解决方案2】:

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

    【讨论】:

    • 明天试试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2017-07-09
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多