ArangoDB 获取文档的索引

ArangoDB Getting the Index of a Document

有没有办法在 ArangoDB 中获取特定文档的索引,以便在 LIMIT 操作中使用它?例如,假设我通过它的 ID 查找一个文档,发现它的索引是 534,那么我会像这样使用它:

LIMIT 534, 30

...和return我查找的文档之后的下30个文档。但是,我似乎找不到使用 AQL 获取文档索引的方法...

如果你不应用任何排序过滤器,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()

有限制地工作。

您也可以 use cursors to fetch partial results

问题是下一个文档的实际含义。

如果这里的next表示文档键索引顺序:

文档在集合中没有特定的 "order" 或 "index"。集合中的文档按未排序主索引中的 _key / _id 属性组织。

要获取下一个文档键(假设按字典顺序排序的键),必须读取集合中的所有键,对它们进行排序,然后以某种方式找到当前文档的索引以获取下一个键。这将是非常低效的。

集合上的其他索引是可选的,因此不能指望它们存在并可用于此类查询。

如果这里的 next 表示插入或更新顺序,那么也没有明智的方法来获取 next 文档。

一种解决方法可能是在某些文档属性上使用排序的(即跳过列表)索引,理想情况下是唯一的索引,并在插入文档时填充它(如果更新也应该更改 文档的顺序).

然后要查找 下一个 文档,请执行以下操作:

  • 首先通过其_id_key找到想要的文档,并将文档数据取入应用程序

  • 获取其上具有排序索引的文档属性,并在后续的 AQL 查询中使用它,如下所示

这将允许您找到原始文档之后的文档,但是,您必须以某种方式维护顺序属性:

FOR doc IN collection
  FILTER doc.`order` > @value
  LIMIT 0, 30
  RETURN doc

如果您的文档有一些可用于排序的属性,这将很容易做到,但如果它们没有这样的属性,这将是一个笨拙的解决方案。