有没有办法在 ArangoDB 中获取特定文档的索引以便在 LIMIT 操作中使用它?例如,假设我通过它的 ID 查找一个 Document 并发现它的索引是 534,那么我会这样使用它:
LIMIT 534, 30
...并在我查找的文档之后返回接下来的 30 个文档。但是,我似乎找不到使用 AQL 获取文档索引的方法...
问题是下一份文件实际上应该意味着什么。
如果此处的下一个表示文档键索引顺序:
文档在集合中没有特定的“顺序”或“索引”。集合中的文档在未排序的主索引中由它们的_key
/属性组织。_id
要获取下一个文档键(假设按字典顺序排序的键),必须读取集合的所有键,对它们进行排序并以某种方式找到当前文档的索引以获取下一个键。这将是非常低效的。
集合上的其他索引是可选的,因此不能依赖它们存在并且可用于此类查询。
如果这里的next表示插入或更新顺序,那么也没有明智的方法来获取下一个文档。
一种解决方法可能是在某些文档属性上使用排序(即跳过列表)索引,理想情况下是唯一的,并在每当插入文档时填充它(如果更新也应该改变文档的顺序,则可能会更新)。
然后要查找下一个文档,请执行以下操作:
_id
首先通过其或找到所需的文档_key
并将文档数据提取到应用程序中
获取具有排序索引的文档属性,并在后续 AQL 查询中使用它,如下所示
这将允许您找到原始文档之后的文档,但是,您必须以某种方式维护 order 属性:
FOR doc IN collection
FILTER doc.`order` > @value
LIMIT 0, 30
RETURN doc
如果您的文档有一些无论如何都可以用于排序的属性,这将很容易做到,但如果它们没有这样的属性,这将是一个笨拙的解决方案。
如果您不应用 anny 排序过滤器,ArangoDB 不需要特殊序列。
所以,做
db._create("testCollection");
for (var i = 0; i < 10; i ++) db.testCollection.save({which: i})
db._query("FOR i IN testCollection RETURN i.which").toArray()
会给你一个相当随机的序列。
db._query("FOR i IN testCollection SORT i.which RETURN i.which").toArray()
会给你一个格式良好的结果。
然后你可以这样做:
db._query("FOR i IN testCollection SORT i.which LIMIT 3, 5 RETURN i.which").toArray()
有限制地工作。