【问题标题】:eficient elimination of old documens有效清除旧文件
【发布时间】:2020-05-03 07:47:35
【问题描述】:

使用 ArangoDB 3.6.x,我有一个场景,连续文档进入数据库,需要不断消除旧文档。什么可能是一种有效/简单的算法来确定文件以消除这些记录。我可以使用文档“_key”进行选择和淘汰吗?

我想从数据库中检索文档以查看每个文档将是一种不好的方法,因此我试图找到一种可能简单、高效的算法。理想情况下,数据库本身会提供这样的机制,比如分区。前任它不必非常精确地涉及数据时间戳,但它必须有效,因为我必须确保文档总数保持在最大值以下。

我特别关注 ArangoDB。

谢谢 若昂

【问题讨论】:

标签: arangodb


【解决方案1】:

这取决于您如何限定“旧”文件。如果这些是按日期计算的,那么您只需确保每个文档都有一个数字时间戳属性。我在 JavaScript 中使用 AQL DATE_NOW() 函数或 (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

如果“旧”有其他含义,例如“此文档是否存在于另一个集合中”,那么最好的办法是使用匹配的查找键。这可能是_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

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

【讨论】:

    猜你喜欢
    • 2014-07-07
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    相关资源
    最近更新 更多