限制数组大小 Couchbase 更新查询
Limit array size Couchbase update query
我有一个 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 *
您可以使用索引 ARRAY 运算符限制数组的长度,如下所示:
select array v for i:v in ["a", "b", "c", "d"] when i < 2 end
结果:
[
{
"": [
"a",
"b"
]
}
]
您还可以使用更灵活的子查询表达式(例如基于对象的逻辑字段删除)等。如果您需要 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
我有一个 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 *
您可以使用索引 ARRAY 运算符限制数组的长度,如下所示:
select array v for i:v in ["a", "b", "c", "d"] when i < 2 end
结果:
[
{
"": [
"a",
"b"
]
}
]
您还可以使用更灵活的子查询表达式(例如基于对象的逻辑字段删除)等。如果您需要 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