ArangoDB 有效清除旧文档

4nkexdtk  于 2022-12-09  发布在  Go
关注(0)|答案(1)|浏览(185)

使用ArangoDB 3.6.x,我有一个场景,连续的文档进入数据库,需要不断地删除旧的文档。什么是一个有效/简单的算法来确定删除这些记录的文档?我可以使用文档“_key”来选择和删除吗?
我想从数据库中检索文档来查看每个文档是一种糟糕的方法,所以我试图找到一种简单、高效的算法。理想情况下,数据库本身会提供这样的机制,比如分区,例如,它不会'关于数据时间戳,我不需要非常精确,但在我必须确保文档总数保持不变的意义上,它必须是有效的低于最大值。
我特别关注ArangoDB。
谢谢你João

sxpgvts3

sxpgvts31#

这取决于您如何限定“旧”文档。如果这些文档是按日期排序的,那么您只需确保每个文档都有一个数字时间戳属性。我使用AQL DATE_NOW()函数或JavaScript中的(new Date()).valueOf()。然后,只需在时间戳属性上添加一个skiplist索引,就可以按大于/小于x的数字进行近乎即时的排序和/或过滤。

LET millisecondsAgo = (8 * 60 * 60 * 1000)  // 8 hours
FOR a IN collection_a
    FILTER a.timestamp < (DATE_NOW() - millisecondsAgo)
    REMOVE a IN collection_a

如果“old”指的是其他的东西,比如“这个文档存在于另一个集合中吗”,那么最好的办法就是有一个匹配的查找键。这可以是_key属性或其他属性,但是它必须是唯一的。我用这个来协调集合之间的“现有”文档:

FOR a IN collection_a
    FILTER LENGTH(
        FOR b IN collection_b
            FILTER b.uniqueKey == a.uniqueKey
            RETURN true
    ) == 0
    REMOVE a IN collection_a

应该有hash index(在UI中称为“持久索引”,唯一是好的,但不是必需的)。然后,FOR b IN collection_b ...查询将使用该索引进行超快速匹配,如果找到内容,则返回true。如果没有匹配的记录,则不返回任何内容,因此返回的数组长度为零。2哈希键查找+计算一个非常小的数组的长度应该***非常***快。

相关问题