使用ArangoDB 3.6.x,我有一个场景,其中连续文档进入数据库,并且需要不断消除旧文档。确定文档以消除这些记录的有效/简单算法可能是什么。我可以使用文档“ _key”进行选择和消除吗?
我想从数据库中检索文档以查看它们中的每一个都是一种不好的方法,因此,我试图找到一种可能简单,有效的算法。理想情况下,数据库本身将提供诸如分区之类的机制。例如关于数据时间戳记,它不必非常精确,但必须有效,因为我必须确保文档总数保持在最大值以下。
我特别关注ArangoDB。
谢谢João
这取决于您如何限定“旧”文档。如果这些按日期排列,则只需确保每个文档都具有数字时间戳属性即可。我在JavaScript中使用AQL DATE_NOW()
函数或(new Date()).valueOf()
。然后,只需在timestamp属性上添加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
hash index和collection_a
上的collection_b
上均应有一个uniqueKey
(在UI中称为“持久索引”,唯一是好的,但不是必需的)。然后,FOR b IN collection_b ...
查询将使用索引快速匹配超级,如果发现某些内容,则返回true
。如果没有匹配的记录,则不返回任何内容,因此返回的数组长度为零。哈希键查找+计算非常小的数组的长度应该非常快速。