LET millisecondsAgo = (8 * 60 * 60 * 1000) // 8 hours
FOR a IN collection_a
FILTER a.timestamp < (DATE_NOW() - millisecondsAgo)
REMOVE a IN collection_a
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哈希键查找+计算一个非常小的数组的长度应该***非常***快。
1条答案
按热度按时间sxpgvts31#
这取决于您如何限定“旧”文档。如果这些文档是按日期排序的,那么您只需确保每个文档都有一个数字时间戳属性。我使用AQL
DATE_NOW()
函数或JavaScript中的(new Date()).valueOf()
。然后,只需在时间戳属性上添加一个skiplist索引,就可以按大于/小于x
的数字进行近乎即时的排序和/或过滤。如果“old”指的是其他的东西,比如“这个文档存在于另一个集合中吗”,那么最好的办法就是有一个匹配的查找键。这可以是
_key
属性或其他属性,但是它必须是唯一的。我用这个来协调集合之间的“现有”文档:应该有hash index(在UI中称为“持久索引”,唯一是好的,但不是必需的)。然后,
FOR b IN collection_b ...
查询将使用该索引进行超快速匹配,如果找到内容,则返回true
。如果没有匹配的记录,则不返回任何内容,因此返回的数组长度为零。2哈希键查找+计算一个非常小的数组的长度应该***非常***快。